【问题标题】:Authenticating a user the "right" way - do I need to access the user password from db?以“正确”方式对用户进行身份验证 - 我需要从数据库访问用户密码吗?
【发布时间】:2017-03-22 21:21:31
【问题描述】:

我正在尝试实现用户身份验证,并且在我的服务器上我正在执行以下登录操作:

从请求正文的电子邮件/密码中查询用户电子邮件/密码。所以,我的选择查询会返回类似:

我在通过 bcrypt 运行密码后存储密码。现在,如果 req.body 中的用户密码是“kittycats”,我是否应该使用 bcrypt 的比较在 req.body.passworddb.password 之间进行比较?

我是这种东西的新手,所以我不知道这是否被认为是一种“好的做法”,或者我这样做是否完全错误。

谢谢

【问题讨论】:

  • 没有“bcrypt 的解码”——bcrypt 是一个散列函数。
  • 使用 bcrypt 对他们的输入进行哈希处理,并将结果与​​存储在数据库中的内容进行比较。
  • 对不起,我的意思是 bcrypt 比较。抱歉还在学习

标签: node.js authentication passwords


【解决方案1】:

是的,比较功能允许使用存储的哈希验证密码。实际上我不熟悉 node.js 库,但我认为这是 API 文档:

https://github.com/kelektiv/node.bcrypt.js#to-check-a-password

比较函数的工作方式与任何其他 BCrypt 库一样,它从存储的哈希中提取盐和成本因子,并从密码中计算出可比较的哈希。然后检查存储的哈希值和计算的哈希值是否相同。

【讨论】:

    【解决方案2】:

    你可以通过passport.js.实现它

    您可以在 passport.js 中设计一个本地策略来进行身份验证。有一个可用的 NPM 包。查看passport-local

    从您的问题来看,您似乎正在使用 SQL 数据库。我不确定如何使用 SQL 数据库使用护照。有一个thread 谈到了将护照与 SQL 一起使用。请检查一下。

    我可以向你展示我如何将 passport.js 与 mongoose 一起使用。

    // 我的用户模型:

    var mongoose = require('mongoose');
    var passportLocalMongoose = require('passport-local-mongoose');
    var Schema = mongoose.Schema;
    
    var userSchema = new Schema({
        username: String,
        password: String
    });
    
    userSchema.plugin(passportLocalMongoose);
    
    var User = mongoose.model('user', userSchema);
    module.exports = User;
    

    //在app.js中添加这个

    var express = require('express');
    var app = express();
    var passport = require('passport');
    var LocalStrategy = require('passport-local').Strategy;
    var User = require('/path/to/user/model');
    
    passport.use('user', new LocalStrategy(User.authenticate()));
    passport.serializeUser(User.serializeUser());
    passport.deserializeUser(User.deserializeUser());
    
    app.post('/register', function(req, res){
        User.register(new User({
            username: req.body.username
          }),
          req.body.password,
          function(err, user) {
              passport.authenticate('local')(req, res, function() {
                return res.status(200).json({
                  success: true,
                  message: 'Registration Successful!'
                });
          });
        );
    });
    
    app.post('/login', function(req, res){
        passport.authenticate('user', function(err, user, info) {
          if (err) {
           //handle err
          }
          if (!user) {
            //user not found
          }
          req.logIn(user, function(err) {
            if (err) {
              //handle err
            }
    
            //Login successful! 
          });
        })(req, res, next);
    });
    

    希望你觉得它有用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2012-11-30
      相关资源
      最近更新 更多