Я пытаюсь проверить, защищен ли запрос GET на определенный маршрут с помощью веб-токенов JSON с паспортом JwtStrategy; однако похоже, что функция промежуточного программного обеспечения passport.use
в моем файле server.js
не выполняется. Console.log, который у меня есть, никогда не отображается в моей оболочке/терминале. Мой маршрут входа работает, но не маршрут профиля. Я использую почтальона, и я ввел http://localhost:3000/profile
для метода GET, а на вкладке Headers
я выбрал авторизацию для ключа, а для значения я скопировал и вставил длинную строку веб-токена JSON, но он продолжает говорить неавторизованным. Это потому, что моя функцияpassport.use никогда не выполняется.
//Файл Server.js
var JwtStrategy = require("passport-jwt").Strategy;
var ExtractJwt = require("passport-jwt").ExtractJwt;
var User = require("../models/user");
var config = require('./secret');
app.use(passport.initialize());
app.use(passport.session());
let options = {};
//pass token back and forth
options.jwtFromRequest = ExtractJwt.fromAuthHeader();
options.secretOrKey = config;
passport.use(new JwtStrategy(options, (jwt_payload, done) => {
*******************************************
//this console log doesn't show up in shell which makes be believe its never getting here
*******************************************
console.log("JWT PAYLOAD", jwt_payload)
User.getUserById(jwt_payload._id, (err, user) => {
if(err){
return done(err, false);
}
if(user){ //null for error
return done(null, user);
}else{
return done(null, false);
}
});
}));
//Файл маршрутов, в котором вызывается обратный вызов паспорта.authenticate
var passport = require('passport');
var jwt = require('jsonwebtoken');
var secret = require('../config/secret')
var User = require('../models/user');
router.post('/login', (req, res) => {
var username = req.body.username;
var password = req.body.password;
console.log("SECRET2", secret);
console.log("SECRET", secret.secret);
User.getUserByUsername(username, (err, user) => {
if(err){
throw err;
}
if(!user){
return res.json({ success: false, msg: "User not found"});
}
User.comparePassword(password, user.password, (err, isMatch) => {
if(err){
throw err;
}
if(isMatch){
var token = jwt.sign(user, secret.secret, {
expiresIn: 604800 //1 week in seconds, token expires and requires to log back in
});
console.log('TOKEN IN LOGIN ROUTE', token)
res.json({
//tokens are then stored in local storage or cookie
success: true,
token: 'JWT ' + token,
user: {
id: user._id,
name: user.name,
username: user.username,
email: user.email
}
});
}else{
return res.json({ success: false, msg: "Incorrect password"});
}
});
});
});
router.get('/profile', passport.authenticate('jwt', {session:false}), (req, res) => {
res.json({user: req.user});
});
//Модель пользователя
var mongoose = require('mongoose');
var bcrypt = require('bcryptjs');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
name: {
type: String,
trim: true,
required: "First Name is Required"
},
email: {
type: String,
required: true
},
username: {
type: String,
required: true
},
password: {
type: String,
required: true
}
});
var User = mongoose.model("User", UserSchema);
module.exports = User;
//Alternate syntax for exporting Schema
// var User = module.exports = mongoose.model("User", UserSchema);
module.exports.getUserById = function(id, callback){
User.findById(id, callback);
}
module.exports.getUserByUsername = function(username, callback){
var query = { username: username }
User.findOne(query, callback);
}
//Custom User model function that will take in the newUser object and hash the password.
module.exports.addUser = function(newUser, callback){
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(newUser.password, salt, (err, hash) => {
if(err){
throw err
}
newUser.password = hash;
newUser.save(callback);
});
});
}
module.exports.comparePassword = function(password, hash, callback){
bcrypt.compare(password, hash, (err, isMatch) => {
if(err){
throw err
}
callback(null, isMatch);
});
}
Обновление: я попытался поставить пробел после «JWT» для значения «Авторизация» в почтальоне, но он все еще не работает, и журнал консоли не отображается. Это потому, что я каким-то образом не экспортирую или не связываю passport.use
, который я определил в своем server.js
, с моим маршрутом GET '/ profile' в моем файле маршрутов?
Обновление 2: добавлена модель и маршрут входа
Authorization
должно выглядеть так:JWT the-actual-token
. Посмотрите здесь. - person robertklep   schedule 07.05.2017Authorization
недействителен. - person robertklep   schedule 07.05.2017JWT ABCDEF
- person robertklep   schedule 07.05.2017secret.secret
, но в параметрах стратегии вы используетеsecret
, что кажется неправильным. В качестве отступления:expiresIn
должно быть в миллисекундах, а не в секундах (теперь срок действия истекает через 10 минут), и, строго говоря,JWT
не должно быть частью токена. - person robertklep   schedule 08.05.2017