带有GET方法的护照js

passport js with GET method

我正在尝试通过向用户的电子邮件地址发送激活码来确认用户的电子邮件地址。当用户点击激活器 URL(GET 方法)时,服务器将比较激活器代码 + 用户名并尝试处理它。

我正在使用这样的 GET 方法:

router.get('/activator/:username/:activator', function(req, res, next){
        passport.authenticate('activator', function(err, user, info){
            if (err) {console.log('Error info: ', info);}
            else if (!user) {console.log('User not found: ' , info)}
            else {console.log('User activated')}
            res.redirect('/');
        })(req, res, next)
 });

activator.js是:

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

module.exports = function(passport){

    passport.use('activator', new LocalStrategy({
            usernameField: 'username',
            passwordField: 'activator'
        },
        function(username, password, done) { 
            User.findOne({username: username , activator: password},
                function(err, user){
                    if (err){
                        return done(null, false, 'User not found.');
                    }
                    user.activate = true;
                    user.save(function (err) {
                        if (err) return handleError(err);
                        return done(null, user, 'Persistence Registration successful');
                    });
                });
        })
    );
};

但是服务器响应是:{ message: 'Missing credentials'} 看来 passport js 和 GET 方法参数有一些冲突。

我说得对吗?我该怎么做?

您的策略字段无效,将其替换为 emailpassword 并从客户端发送相同的参数

module.exports = function(passport) {

  passport.use('activator', new LocalStrategy({
      usernameField: 'email',
      passwordField: 'password',
    },
    function(username, password, done) {
      User.findOne({
          username: username,
          activator: password
        },
        function(err, user) {
          if (err) {
            return done(null, false, 'User not found.');
          }
          user.activate = true;
          user.save(function(err) {
            if (err) return handleError(err);
            return done(null, user, 'Persistence Registration successful');
          });
        });
    }));
};

问题已解决!

如我所说,问题出在 GET 方法和护照连接上。 护照功能仅从 req.query 读取,它仅在 POST 方法上,但 GET 方法正在使用 req.params.

所以我将应用程序代码更改为:

router.get('/activator/:username/:activator', function(req, res, next){
        req.query = req.params; // GET to POST simulator!
        passport.authenticate('activator', function(err, user, info){
            if (err) {console.log('Error info: ', info);}
            else if (!user) {console.log('User not found: ' , info)}
            else {console.log('User activated')}
            res.redirect('/');
        })(req, res, next)
 });