护照js与GET方法

时间:2016-09-30 09:01:18

标签: node.js express get passport.js

我尝试通过向其电子邮件地址发送激活码来确认用户的电子邮件地址。当用户点击激活器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'} 似乎护照js和GET方法params有一些冲突。

我是对的吗?我该怎么做?

2 个答案:

答案 0 :(得分:1)

问题解决了!

正如我所说,问题出在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)
 });

答案 1 :(得分:0)

您的策略字段无效,请将其替换为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');
          });
        });
    }));
};