#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