Как вызвать несколько стратегий passport-jwt в одном приложении - PullRequest
0 голосов
/ 25 февраля 2019

Я могу различать два маршрута и аутентифицировать первый маршрут (студент).Когда я вызываю второй маршрут (учитель) для аутентификации, возвращается пустой JSON-файл.

В users.js «passportStudent.authenticate» работает и возвращает JSON-файл с информацией о пользователе, как и предполагалось, но яЯ не уверен, почему «passportTeacher.authenticate» возвращает пустой файл JSON.

Вот мой код:

users.js:

const passportStudent = require('passport');
const passportTeacher = require('passport');

/*Some code here*/

router.get('/profile/student', passportStudent.authenticate('student', {session: false}), (req, res, next) =>{
    res.json({user : req.user});
});

router.get('/profile/teacher', passportTeacher.authenticate('teacher', {session: false}), (req, res, next) =>{
    res.json({teacher : req.teacher});
});

passport.js:

    const JwtStrategy = require('passport-jwt').Strategy;
    const ExtractJwt = require('passport-jwt').ExtractJwt;
    const User = require('../models/user');
    const Teacher = require('../models/teacher');
    const config = require('../config/database');

    module.exports = function(passport){
        let opts = {};
        opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
        opts.secretOrKey = config.secret;
        passport.use('student', new JwtStrategy(opts, (jwt_payload, done)  => {
            console.log(jwt_payload);
            User.getUserById(jwt_payload.data._id, (err, user) => {
                if(err){
                    return done(err, false);
                }
                if(user){
                    return done(null, user);
                }
                else{
                    return done(null, false);
                }
            });
        }));

        passport.use('teacher', new JwtStrategy(opts, (jwt_payload2, done)  => {
            console.log(jwt_payload2);
            Teacher.getTeacherById(jwt_payload2.data._id, (err, teacher) => {
                if(err){
                    return done(err, false);
                }
                if(teacher){
                    return done(null, teacher);
                }
                else{
                    return done(null, false);
                }
            });
        }));
    }

код app.js для паспорта:

const passportStudent = require('passport');
const passportTeacher = require('passport');

/*Some code here*/

app.use(passportStudent.initialize());
app.use(passportStudent.session());

app.use(passportTeacher.initialize());
app.use(passportTeacher.session());

require('./config/passport')(passportStudent);
require('./config/passport')(passportTeacher);

Как я могу аутентифицироваться на желаемых маршрутах?Или я должен пойти на местную стратегию для студента и JWT для учителя?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 26 февраля 2019

В обоих случаях в паспорте хранится информация о подписанных пользователях в req.user.

. Поэтому необходимо обновить маршрутизатор учителя до

router.get('/profile/teacher', passportTeacher.authenticate('teacher', {session: false}), (req, res, next) =>{
    res.json({teacher : req.user});
});

Здесь я изменяю

res.json({teacher : req.teacher});

К

res.json({teacher : req.user});
...