Я использую стратегию JWT паспортного файла для аутентификации моего приложения MEAN-Stack. Незащищенные маршруты работают правильно, но я не могу заставить работать защищенные маршруты. они всегда возвращают внутреннюю ошибку сервера 500, даже если я придерживаюсь документации. Вот код:
я инициализирую в index.js перед применением маршрутов:
server.use(passport.initialize());
Мой установочный файл Passport.js:
const JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../models/user');
const config = require('../config/db');
module.exports = function(passport) {
let opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = config.secret;
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
User.findOne({_id: jwt_payload._id}, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
return done(null, user);
} else {
return done(null, false);
}
});
}));
};
Мой маршрут, который не работает:
const express = require('express');
const router = express.Router();
const config = require('../config/db');
const jwt = require('jsonwebtoken');
const User = require('../models/user');
require('../config/passport');
const passport = require('passport');
router.get('/profile', passport.authenticate('jwt', {session: false}), function(req,
res){
res.json(user);
});
module.exports = router;
мой токен настроен правильно, так как я могу декодировать его вручную.
Как я вызываю этот маршрут из angular (я знаю, что мне действительно не нужен параметр userId для самого вызова):
public getProfile(userId) : any{
let httpOptions = {
headers: new HttpHeaders({ 'Authorization': `Bearer ${this.token}` })
};
this.http.get('http://localhost:8080/api/v1/profile', httpOptions).subscribe(res => {
console.info('got the profile for user with id: ' + userId + '=> ' + res);
return res;
}, err => {
console.info(err);
});
}
Любая помощь приветствуется. Спасибо заранее за ваше время!
Обновлено: журналы мангуста
Mongoose: users.findOne({ _id: ObjectId("5bcf1218cace7d1168a23672") }, {
projection: {} })
GET /api/v1/profile 500 4.579 ms - 5
OPTIONS /api/v1/profile 204 0.097 ms - 0
{ _id: '5bcf1218cace7d1168a23672',
email: '[email protected]',
password: '$2a$10$z8li41jQMESsmbIyQUsPfO6VkYjOyO/ybj4lW04VGUkJmlShydBN.',
name: '12',
age: 12,
gender: 'male',
description: '12',
question: '12',
__v: 0,
iat: 1540419498 }
Mongoose: users.findOne({ _id: ObjectId("5bcf1218cace7d1168a23672") }, {
projection: {} })
GET /api/v1/profile 500 3.995 ms - 5
Я не получаю никакого вывода, если консоль записываю, что jwt_payload
подтвердите new HttpHeaders({ 'Authorization':
Bearer $ {this.token} `})` ваш токен установлен или проверьте свой токен доступа с помощью Postman / cURL
Я добавил однострочные комментарии к хит-спотам, проверил места и прокомментировал соответственно для дальнейшей отладки. Подтвердите, что /api/v1/
- это быстрый корневой маршрут.
Passport.js
const JwtStrategy = require('passport-jwt').Strategy,
const ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../models/user');
const config = require('../config/db');
module.exports = function(passport) {
let opts = {
secretOrKey: config.secret,
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
issuer: 'TODO', // configure issuer
audience: 'TODO' // configure audience
};
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
console.info(jwt_payload); // confirm _id is defined
User.findOne({ _id: jwt_payload._id }, function(err, user) {
if (err) {
return done(err, false);
}
if (!user) {
return done(null, false);
}
return done(null, user);
});
}));
};
route.js
const express = require('express');
const passport = require('passport');
const jwt = require('jsonwebtoken');
const config = require('../config/db');
const User = require('../models/user');
const router = express.Router();
require('../config/passport');
router.get('/profile', passport.authenticate('jwt', { session: false }), function(req, res) {
res.json(req.user); // use req.user not user
});
module.exports = router;
Привет, спасибо за уделенное время. Я сделал все, что вы сказали, за исключением того, что установил издателя и аудиторию, потому что я не знаю, что туда вставлять, а в документах нет ясности, что вставлять. Я не получаю никаких выходных данных, если консоль записываю, что jwt_payload. Я добавил логи мангуста, может быть, они помогут?
Прочтите эту статью для этого руководства по JWT и tools.ietf.org/html/rfc7519#section-4.1.1
подтвердить, что
jwt_payload._id
определен