Проблема:
Когда я регистрирую пользователя, все работает хорошо.Я также могу войти через почтальона и получить «Жетон на предъявителя».Когда я перехожу к маршруту с именем «/ current» и вставляю токен носителя в почтальон, я получаю сообщение о несанкционированной ошибке, несмотря на то, что вошел в систему и использовал текущий токен носителя.
Цель:
Цель состоит в том, чтобы войти в систему, чтобы получить сведения о полезной нагрузке в моей консоли (см. Файл passport.js ниже) и получить сообщение об успешном завершении работы почтальона.
Файлы и изображения:
На первом изображении показана успешная регистрация
Это следующее изображение, когда я успешно захожу и получаютокен на предъявителя
В первом изображении ниже я пробовал два разных способа, которые я пробовал на вкладке авторизации в Postman, а второй - заголовки ипросто вставив авторизацию и токен на предъявителя, который я получил.В любом случае, после того как я нажму кнопку «Отправить», я получаю несанкционированный доступ, несмотря на наличие текущего токена.
Вот мои файлы, начинающиеся с users.js:
const express = require('express');
const router = express.Router();
const gravatar = require('gravatar');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const keys = require('../../config/keys');
const passport = require('passport');
//Load User Model
const User = require('../../models/User');
// @route GET api/users/test
// @desc Tests users route
// @access Public
router.get('/test', (req, res) => res.json({
msg: 'Users Works'
}));
// @route GET api/users/register
// @desc Register
// @access Public
// In order to use req.body you need to make sure you have body parser
router.post('/register', (req, res) => {
User.findOne({
email: req.body.email
}).then(user => {
if (user) {
return res.status(400).json({
email: 'Email Already Exists'
});
} else {
const avatar = gravatar.url(req.body.email, {
s: '200', //Size
r: 'pg', //Rating
d: 'mm' //Default
});
const newUser = new User({
name: req.body.name,
email: req.body.email,
avatar,
password: req.body.password
});
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(newUser.password, salt, (err, hash) => {
if (err) throw err;
newUser.password = hash;
newUser
.save()
.then(user => res.json(user))
.catch(err => console.log(err));
})
})
}
})
});
// @route GET api/users/login
// @desc Login user / Returning JWT Token
// @access Public
router.post('/login', (req, res) => {
const email = req.body.email;
const password = req.body.password;
//Find user by email
User.findOne({
email
})
.then(user => {
//Check for user
if (!user) {
return res.status(404).json({
email: 'User not found'
});
}
//check password
bcrypt.compare(password, user.password)
.then(isMatch => {
if (isMatch) {
//User Matched
const payload = {
id: user.id,
name: user.name,
avatar: user.avatar
} //Create JWT payload
//Sign Token
jwt.sign(payload,
keys.secretOrkey, {
expiresIn: 36000
},
(err, token) => {
res.json({
success: true,
token: 'Bearer ' + token
});
});
} else {
return res.status(400).json({
password: 'Password Incorrect'
});
}
});
});
});
// @route GET api/users/current
// @desc Return current user
// @access Private
router.get(
'/current',
passport.authenticate('jwt', {
session: false
}),
(req, res) => {
res.json({
msg: 'Success'
});
}
);
module.exports = router;
Вот это passport.js
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const mongoose = require('mongoose');
const User = mongoose.model('users');
const keys = require('../config/keys');
const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = 'keys.secretOrKey';
module.exports = passport => {
passport.use(
new JwtStrategy(opts, (jwt_payload, done) => {
console.log(jwt_payload);
})
);
};