2016-09-30 80 views
0

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

我使用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有一些冲突。

我是对的吗?我应该为此做些什么?

回答

0

问题解决了从客户端发送相同的参数!

正如我所说的,问题是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) 
}); 
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'); 
      }); 
     }); 
    })); 
}; 
+0

莫非是真正的问题?我猜想URL中的参数在护照认证中不可访问! –

+0

不工作,我的PARAMS是激活和用户名没有电子邮件和密码 –

+0

@ShriramManoharan我没有看到任何地方,除了那些领域也可以看到他们的文档https://github.com/jaredhanson/passport-local – abdulbarik