【问题标题】:Passport Local Remember Me Strategy护照本地记住我策略
【发布时间】:2017-06-12 17:05:36
【问题描述】:

我正在尝试创建一个护照记住我的策略,但我不知道如何调用它。我的总体策略是将两个令牌存储在我的数据库中并作为 cookie 存储在客户端计算机上,然后进行比较以验证它们是否是真实用户。我目前正在尝试通过 app.use a passport.authenticate 策略,以便我可以使用我的策略验证失败是否成功。

在我的 app.js 文件中,我有:

    passport.use('rememberMe',new passportLocal.Strategy({ passReqToCallback: true },
  (req, cb) => {
    //check req.cookies['token']...
    return cb(null, (rememberMe.checkPersistance(req.cookies['token'], req.cookies['statictoken'])));
  }));

app.use((req, res) => passport.authenticate('rememberMe'), (req, res) => {
  //successfully logged in!
})

注意:rememberMe.checkPersistance 与数据库进行比较并返回真或假。

我的问题是我认为我没有正确使用 app.use 语法,我不确定正确的方法是什么。当它不在 .POST 函数中时,如何使用 passport.authenticate?

【问题讨论】:

    标签: node.js passport.js mern


    【解决方案1】:

    我想出了这个问题的答案,总的来说我只有这个问题,因为我不明白 .get 和 .post 是如何工作的。对于您传递给它的每个函数,该函数都可以获取请求、响应和下一步。

    因此,对于您将在网上看到的大多数护照示例,您可以将 .post 替换为 .get。它们之间的区别在于 post 旨在发送数据然后返回某些内容(例如登录信息),而 get 旨在成为查询某些信息的一种方式。 Here是更详细的解释。

    【讨论】:

      【解决方案2】:

      为令牌创建架构

      'use strict'
      const mongoose = require('mongoose'),
      Schema = mongoose.Schema;
      
      const TokenSchema = Schema({
          value: {
              type: String,
              required: true
          },
      
          user: {
              type: Schema.Types.ObjectId,
              ref: 'users',
              required: true
          }
      });
      
      module.exports = mongoose.model('token', TokenSchema);
      

      然后定义你的策略

      passport.use(new RememberMeStrategy(
          function(token, done) {
              Token.findOneAndRemove({ value: token })
              .populate('user')
              .exec( function (err, doc) {
                  if(err) return done(err);
                  if(!doc) return done(null,false);
                  return done(null, doc.user);
              });
          },
          function(user, done) {
              crypto.randomBytes(64, (err, buf) => {
                  const value = buf.toString('hex');
                  const token = new Token({
                      value: value,
                      user: user._id
                  });
                  token.save((err) => {
                      if (err) return done(err);
                      console.log(value);
                      return done(null, value)
                  });
              });
          }
      ));
      

      我发现了一个问题:定义此策略后我无法注销并选中记住我框。 我只想在我回来时自动填充表单登录,但似乎这个模块没用,它没有我想要的行为。

      【讨论】:

        猜你喜欢
        • 2016-05-29
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 2020-01-04
        相关资源
        最近更新 更多