Как получить экспресс маршрут для прохождения паспорта для аутентификации
Я недавно изменяю шаблон, который я сделал в es6, на немного более старую версию es5. Мне пришлось воссоздать экспорт, требовать вместо использования импорта, и теперь маршрутизация работает.
У меня есть такая структура:
index.js (app)
api/index.js (/api endpoint)
api/auth.js (/api/auth endpoint)
api/protected.js (/api/protected endpoint)
В моем маршруте аутентификации у меня есть логин и регистрация, функционирующая и генерирующая токен:
const token = jwt.sign({id: req.body.username}, config.jwtSecret)
В моем защищенном.js у меня есть следующее:
const express = require('express');
const router = express.Router();
const passport = require('../config/passport');
router.use(passport.initialize({ session: false }));
router.use(passport.session());
router.get('/test', passport.authenticate('jwt') , (req, res) => {
res.status(200).json({ message: 'Hello sweetie', auth: req.isAuthenticated(), user: req.session.passport.user})
});
module.exports = router;
И в моем passport.js
const
passport = require('passport'),
config = require('./../config'),
passportJwt = require('passport-jwt'),
JwtStrategy = passportJwt.Strategy,
ExtractJwt = passportJwt.ExtractJwt,
userSchema = require('./../schemas/userSchema');
passport.serializeUser(function(user, done) {
console.log(JSON.stringify(user));
done(null, user[0].username);
});
passport.deserializeUser(function(username, done) {
console.log('DESER -- '+username);
userSchema.checkUsername(username)
.then(user => {
console.log(user[0]);
done(null, user[0]);
})
.catch(err =>{
console.log(JSON.stringify(err));
});
});
const jwtOptions = {
secretOrKey: config.jwtSecret,
jwtFromRequest: ExtractJwt.fromHeader('authorization'),
}
passport.use('jwt', new JwtStrategy(jwtOptions, function(jwt_payload, done) {
console.log('Strategy: '+ jwt_payload.id);
userSchema.checkUsername(jwt_payload.id)
.then(user => {
console.log(user[0].username);
if(user[0]) return done(null, user)
else return done(null, false)
})
.catch(err =>{
console.log(JSON.stringify(err));
});
}));
module.exports = passport;
Проблема в том, что когда я пытаюсь получить доступ к: 127.0.0.1:8080/api/protected/test с токеном, который я получил при входе в систему, он дает мне: Unauthorized
Кроме того console.log
внутри:
- serializeUser
- deserializeUser
- Стратегия JWT
Никогда не показываются, и поэтому я думаю, что промежуточное программное обеспечение для паспорта не используется.
Как я мог получить /protected
маршруты использования паспортного промежуточного ПО?
Изменить: я попытался распечатать объект паспорта, и я могу видеть мой jwt
Стратегия действительно определена. Поэтому я не понимаю, почему он не хочет пройти через это.
1 ответ
Проблема в том, что ваш паспорт ищет authorization
заголовок не Authorization
заголовок.
Измени свой
jwtFromRequest: ExtractJwt.fromHeader('authorization')
в
ExtractJwt.fromAuthHeaderAsBearerToken()
так что ваши варианты будут выглядеть
const jwtOptions = {
secretOrKey: config.jwtSecret,
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
}
Теперь, что это делает, будет искать паспорт Authorization
заголовок со значением bearer your_jwt_token
, https://www.npmjs.com/package/passport-jwt