【问题标题】:authenticate user with mongoose + express.js使用 mongoose + express.js 对用户进行身份验证
【发布时间】:2012-09-23 22:29:26
【问题描述】:

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

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

理想情况下,我也可以使用 twitter 和 facebook 对用户进行身份验证。

【问题讨论】:

    标签: express mongoose


    【解决方案1】:

    我总是不喜欢对每个问题都使用插件或模块。只使用猫鼬你可以这样做:

    为您的 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 示例,我添加了猫鼬的东西。希望这会有所帮助!

    【讨论】:

    • 这很有帮助。谢谢。
    【解决方案2】:

    我在学习如何使用 MongoDB 和 Node 时使用了这个示例:

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

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

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

    【讨论】:

    • 谢谢。我在看 Passport,但我认为它不够灵活,我看不到自定义用户身份验证方式的方法。我将通过节点登录代码达到顶峰,并畏缩在玉:)
    • 我也对翡翠感到畏缩。我自己是一个 [EJS](embeddedjs.com) 人。无论您使用什么模板(如果有),您都应该能够使用 node-login 作为指南。
    【解决方案3】:

    Everyauth 是另一种选择,特别是如果您正在寻求更大的灵活性并支持通过第三方(如 twitter 和 facebook)进行身份验证。

    请参阅作者在另一个 SO 问题中的this post,以全面了解其功能和优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-10
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多