0

我正在尝试创建护照记住我的策略,但我不知道如何调用它。我的总体策略是将两个令牌存储在我的数据库中并作为 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?

4

2 回答 2

0

为令牌创建架构

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

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

于 2019-06-20T19:37:54.907 回答
0

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

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

于 2017-06-26T16:40:48.793 回答