passport js с методом GET

#node.js #express #get #passport.js

#node.js #экспресс #получить #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'}
Похоже, что параметры passport js и GET method имеют некоторые конфликты.

Я прав? что я должен для этого сделать?

Ответ №1:

Проблема решена!

Как я уже сказал, проблема заключалась в подключении метода GET и passport. функция passport считывает только 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)
 });
  

Ответ №2:

поля вашей стратегии недопустимы, замените их на email and password и отправьте те же параметры со стороны клиента

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

Комментарии:

1. Может ли это быть реальной проблемой? Я предполагаю, что параметры из URL недоступны при аутентификации по паспорту!

2. не работает, моими параметрами являются активатор и имя пользователя, а не адрес электронной почты и пароль

3. @ShriramManoharan Я не видел ни одного места, где, кроме этих полей, также можно увидеть их документы github.com/jaredhanson/passport-local