使用mongoose + express.js对用户进行身份验证

时间:2012-09-22 18:41:30

标签: express mongoose

使用Mongoose和ExpreeJS对用户进行身份验证的最佳方法是什么。

我正在使用mongoose 3.x,看起来此软件包不再更新:https://github.com/bnoguchi/mongoose-auth

理想情况下,我也可以通过Twitter和Facebook验证用户身份。

3 个答案:

答案 0 :(得分:10)

我总是不想为每个问题使用插件或模块。使用mongoose你可以这样做:

为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的内容。希望这有帮助!

答案 1 :(得分:3)

我在学习如何使用MongoDB和Node执行此操作时使用了此示例:

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

我认为这是一个非常好的孤立的自我进行用户身份验证的例子。它使用bcrypt来哈希和加密用户密码。如果您查看AccountManager内部,您可以看到它如何与Mongo数据库一起使用。

但是,如果您希望使用其他策略进行身份验证,我建议您查看Passport.js。我没有机会使用它,但我认为它看起来非常发达且足够简单。也许您可以根据自己的使用经验更新此页面。

答案 2 :(得分:0)

Everyauth是另一种选择,特别是如果您正在寻找很多灵活性并支持通过Twitter和Facebook等第三方进行身份验证。

在另一个SO问题中查看作者的this post,以便更好地了解其功能和优点。