2

Mongoose と ExpreeJS でユーザーを認証する最良の方法は何ですか?

私は mongoose 3.x を使用していますが、このパッケージはもう更新されていないようです: https://github.com/bnoguchi/mongoose-auth

理想的には、twitter と facebook でもユーザーを認証できます。

4

3 に答える 3

10

私は常に、すべての問題にプラグインやモジュールを使用しないことを好みます。マングースだけを使用すると、次のように実行できます。

mongoDB 構成用の db.js を用意する

var mongoose = require('mongoose');
mongoose.connect("mongodb://...");
var userSchema = new mongoose.Schema({
  username: String,
  salt: String,
  hash: String
});
exports.User = mongoose.model("user", userSchema);

TJ のpass.jsファイルを使用してパスワードをハッシュします。暗号化にはcrypto.pbkdf2を使用します。

手動でユーザーを作成するか、フォームを使用して自己登録を許可します。

var db = require('./db');
var pwd = require('./pwd');
var user = new db.User();
user.username = "Admin";
pwd.hash("adminPassword", function(err, salt, hash) {
  if (err) {
    console.log(err);
  }
  user.salt = salt;
  user.hash = hash;
  user.save(function(err) {
    if (err) {
      console.log(err);
    } else {
      console.log("user saved");
    }
  });
});

これで、データベースにユーザー名、暗号化されたパスワード、およびハッシュを持つユーザーがいるはずです。ログインを確認するには、ミドルウェア関数を使用します。

function authenticate(name, pass, fn) {
  db.User.findOne ({username: name}, function(err, user) {
    if (!user) return fn(new Error('cannot find user'));
    hash(pass, user.salt, function(err, hash){
      if (err) return fn(err);
      if (hash == user.hash) return fn(null, user);
      fn(new Error('invalid password'));
    })
  })
}

app.post('/login', function(req, res){
  authenticate(req.body.username, req.body.password, function(err, user){
    if (user) {
      req.session.regenerate(function(){
        req.session.user = user;
        res.redirect('back');
      });
    } else {
      res.redirect('login');
    }
  });
});

// middleware
function restrict(req, res, next) {
  if (req.session.user) {
    next();
  } else {
    req.session.error = 'Access denied!';
    res.redirect('/login');
  }
}

// route with restrict middleware
app.get('/restricted', restrict, function(req, res){
  res.send('Wahoo! restricted area');
});

ほとんどのコードはauthの例から取ったもので、mongoose 用のものを追加しました。お役に立てれば!

于 2012-09-23T13:41:34.633 に答える
3

MongoDB と Node でこれを行う方法を学習するときに、この例を使用しました。

https://github.com/braitsch/node-login

これは、ユーザー認証を自分で行う、非常に良い孤立した例だと思います。bcrypt を使用して、ユーザー パスワードのハッシュとソルトを行います。AccountManagerの内部を見ると、Mongo データベースでどのように機能するかがわかります。

ただし、他の戦略を使用して認証したい場合は、Passport.jsを確認することをお勧めします。使用する機会はありませんでしたが、かなりよく発達していてシンプルに見えると思います。おそらく、このページをあなたの経験で更新することができます.

于 2012-09-23T01:40:42.550 に答える
0

Everyauthは別のオプションです。特に、TwitterやFacebookなどのサードパーティを介した認証の柔軟性とサポートを求めている場合はなおさらです。

その機能と利点の概要については、別のSOの質問で著者からのこの投稿を参照してください。

于 2012-09-23T14:29:26.980 に答える