使用护照使用 NodeJs mongodb(mongoose) express 的注册表单

Posted

技术标签:

【中文标题】使用护照使用 NodeJs mongodb(mongoose) express 的注册表单【英文标题】:SignUp form with NodeJs mongodb(mongoose) express using passport 【发布时间】:2019-03-04 02:42:02 【问题描述】:

我有一个注册表单,其中包含用户名密码电子邮件等字段,我正在使用 mongodb 存储这些数据,我的架构如下所示:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
const passportLocalMongoose = require("passport-local-mongoose");
 var User = new Schema(
  
    username: type: String, required: true,unique: true ,
    password: type: String,required: true ,
    email:  type: String, unique: true, required: true ,
    admin:  type: Boolean, default: false ,
   usePushEach: true,
  timestamps: true 
);    
User.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", User);

在使用以下代码到达端点之前,我有一个中间件:

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var User = require('./models/user');

exports.local = passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

我有一个点击注册的终点,我写了这个:

router.post("/signup", (req, res, next) => 
  Users.register(
 new Users( username: req.body.username,email:req.body.email ),
 req.body.password,

 function(err, account) 
   if (err) 
        res.statusCode = 500;
        res.setHeader("Content-Type", "application/json");
        res.json( err: "err" );
      
      passport.authenticate("local")(req, res, function() 
        res.send("/books");
      )));

当我在更改后使用用户名密码电子邮件传递 json 对象时,我在邮递员中收到此错误


    "err": 
        "errors": 
            "password": 
                "message": "Path `password` is required.",
                "name": "ValidatorError",
                "properties": 
                    "message": "Path `password` is required.",
                    "type": "required",
                    "path": "password"
                ,
                "kind": "required",
                "path": "password",
                "$isValidatorError": true
            
        ,
        "_message": "User validation failed",
        "message": "User validation failed: password: Path `password` is required.",
        "name": "ValidationError"
    

任何人都可以帮助我解决这个问题,无论是我的 npm 包问题还是我必须处理的任何回电,我都想不通!

【问题讨论】:

【参考方案1】:

您似乎不想在架构中定义密码。 Passport-local-mongoose 会为您解决这个问题!

“您可以随意定义您的用户。Passport-Local Mongoose 将添加用户名、哈希和盐字段来存储用户名、哈希密码和盐值。” - https://github.com/saintedlama/passport-local-mongoose

试试这个:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
const passportLocalMongoose = require("passport-local-mongoose");
 var User = new Schema(
  
    username: type: String, required: true,unique: true ,
    email:  type: String, unique: true, required: true ,
    admin:  type: Boolean, default: false ,
   usePushEach: true,
  timestamps: true 
);    
User.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", User);

router.post('/signup', (req, res, next) => 
  Users.register(
    new Users( username: req.body.username, email: req.body.email),
    req.body.password,
    function(err, account) 
      if (err) 
        res.statusCode = 500;
        res.setHeader('Content-Type', 'application/json');
        res.json( err: 'err' );
      
      passport.authenticate('local')(req, res, function() 
        res.send('/books');
      );
    
  );
);

如果这能解决您的问题,请告诉我。

【讨论】:

您好,感谢您的回复,我已经尝试过并收到此错误:(node:16132) UnhandledPromiseRejectionWarning: TypeError: Pass phrase must be a buffer at pbkdf2 (crypto.js:702:20) at Object.exports.pbkdf2 (crypto.js:682:10) 在 pbkdf2 (D:\reactLibrary\server\node_modules\passport-local-mongoose\lib\pbkdf2.js:8:12) 这很有趣。你检查过 req.body.password 是否存在? 这很奇怪,因为您正试图在第三行创建一个新用户,但您也不能不在文档中包含密码(根据架构定义)。您在运行我的代码时遇到的错误是您需要将密码转换为缓冲区才能使其有效。 好的,我正在查看文档,看起来您不想在架构中定义密码字段;护照本地猫鼬会为您处理。将更新我的答案,这应该可以解决您的问题 是的!请参阅上面的新代码。 Passport-local-mongoose 会为您处理这些。以下是供参考的文档 - github.com/saintedlama/passport-local-mongoose

以上是关于使用护照使用 NodeJs mongodb(mongoose) express 的注册表单的主要内容,如果未能解决你的问题,请参考以下文章

无法使用护照登录 - Nodejs

NodeJs JWT 护照

NodeJs :- 使用本地护照时出现“缺少凭据”错误

如何将 Mongoose/Mongodb 与 node.js- 护照身份验证一起使用

nodejs护照身份验证令牌

与护照、mongodb 和 express 的持久会话