логин для паспорта с JWT - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь реализовать конечную точку входа в систему с помощью passport.js.Моя пользовательская схема содержит ник и пароль.Пока что в app.js у меня есть:

require('./config/passport');
app.use('/user',  passport.authenticate('jwt', {session: false}), require('./routes/user/login.js'));

Мне нужен мой файл passport.js с настройкой стратегии паспорта:

passport.use(new LocalStrategy({ usernameField: 'nickname' }, (nickname, password, done) => {
        User.findOne({ nickname: nickname })
            .then(user => {
                if(!user) {
                    return done(null, false, { message: 'Email and/or password is not valid' });
                }
                bcrypt.compare(password, user.password, (err, isMatch) => {
                    if(err) throw err;
                    if(isMatch) {
                        return done(null, user);
                    } else {
                        return done(null, false, { message: 'Email and/or password is not valid' });
                    }
                });
            });
    })
);

passport.use(new JWTStrategy({
        jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
        secretOrKey: keys.secretJWT
    },
    function (jwtPayload, cb) {
        return User.findOneById(jwtPayload.id)
            .then(user => {
                return cb(null, user);
            })
            .catch(err => {
                return cb(err);
            });
    })
);

и в app.js (первый фрагмент) на/user Мне требуется фактическая конечная точка:

router.post('/login', function (req, res, next) {
    passport.authenticate('local', {session: false}, (err, user, info) => {

        console.log(info);

        if (err || !user) {
            return res.status(400).json({
                message: 'Email and/or password is not valid',
                user: user
            });
        }
        req.login(user, {session: false}, (err) => {
            if (err) next(err);
            //generate a signed JWT with the contents of user object and return it in the response
            const token = jwt.sign(user, keys.secretJWT);
            return res.json({user, token});
        });
    })(req, res);
});

, поэтому в конце она вызывается при вызове /user/login.Странно для меня то, что console.log(info); на самом деле никогда не утешает, я не вижу его в терминале, в котором запущено приложение моего узла.

Я передаю действительные никнейм и пароль, но я всегда получаю 401 Unauthorized:

enter image description here

Что мне не хватает?Может потому, что я не передаю токен?Но при входе в систему я не знаю токен.Это должно быть в ответ на логин.И тогда я буду аутентифицироваться с токеном на дальнейшие запросы.

1 Ответ

0 голосов
/ 13 июня 2019

Я думаю, что вам не хватает псевдонима вашей стратегии в функции passport.use (). Вы используете псевдоним jwt в вашем маршрутизаторе: passport.authenticate('jwt', {session: false})

Итак, ваша функция passport.use () должна выглядеть так:

passport.use('local', new LocalStrategy(...), function(payload, cb){...})
passport.use('jwt', new JWTStrategy(...), function(payload, cb){...})

В противном случае вы не можете сопоставить правильную стратегию с псевдонимом. Также в контроллере входа в систему вы должны вызывать паспорт с «локальным» псевдонимом в этом случае.

...