护照本地记住我策略

Passport Local Remember Me Strategy

我正在尝试创建护照记住我的策略,但我不确定如何调用它。我的总体策略是在我的数据库中存储两个令牌并在客户端计算机上作为 cookie,然后进行比较以验证它们是真实用户。我目前正在尝试通过 app.use 一个 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 与数据库进行比较,returns 判断真假。

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

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

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

为令牌创建架构

'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)
            });
        });
    }
));

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