我正在尝试在我的Express应用程序中设置JWT,但遇到了一些问题!我认为现在大部分都已经解决了,我有一个正确工作并生成有效令牌的注册路由和登录路由,我还有一个在“/users”路由中测试身份验证的路由,这一切都很好。但是我有另一个文件包含“/api”路由,这是身份验证实际上很重要的地方,我有一个类似的测试路由尝试访问req.user(就像我在另一个路由中所做的一样),但似乎req.user未定义。通过一些调试,看起来用户在req.account中,这非常奇怪,我不明白为什么它不在req.user中。
我在/config/passport.js中定义我的jwt策略。
在这个文件中,对于发送请求到GET /api/testAuth的api路由,使用相同的令牌和相同的头信息,我得不到req.user,并且在控制台上看到req.user为undefined。但是在控制台中似乎有用户对象,就像req.account一样?我不明白这里发生了什么,希望有人能帮助!
我在/config/passport.js中定义我的jwt策略。
'use strict';
const User = require('../models/user'),
config = require('./main'),
JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt;
//exported to be used by passport in server set up
module.exports = function (passport) {
const jwtOptions = {
// Telling Passport to check authorization headers for JWT
jwtFromRequest: ExtractJwt.fromAuthHeader(),
// Telling Passport where to find the secret
secretOrKey: config.secret
};
const jwtLogin = new JwtStrategy(jwtOptions, function(payload, done) {
User.findById(payload._id, function(err, user) {
if (err) { return done(err, false); }
if (user) {
done(null, user);
} else {
done(null, false);
}
});
});
passport.use(jwtLogin);
}
护照作为参数传递给此函数,并在主Express文件中初始化。
以下是/users路由文件,它可以正常工作。通过Authorization头和'JWT '向/users/isAuth发送GET请求可以正常工作,并且我会收到发送回来的用户名。
"use strict";
const express = require('express'),
router = express.Router(),
jwt = require('jsonwebtoken'),
User = require('../models/user'),
config = require('../config/main'),
passport = require ('passport');
function generateToken(user) {
return jwt.sign({_id: user._id}, config.secret, {
expiresIn: 10080
});
}
.
. Here are routes for login and register they perform as expected
. and work fine
.
/* ==================================
Test Authentication Route
================================== */
router.get('/isAuth', passport.authenticate('jwt', { session: false }), function(req, res) {
console.log(req.user);
res.json({username: req.user.username});
});
module.exports = router;
在这个文件中,对于发送请求到GET /api/testAuth的api路由,使用相同的令牌和相同的头信息,我得不到req.user,并且在控制台上看到req.user为undefined。但是在控制台中似乎有用户对象,就像req.account一样?我不明白这里发生了什么,希望有人能帮助!
"use strict";
const express = require('express'),
router = express.Router(),
jwt = require('jsonwebtoken'),
Server = require('../models/server'),
passport = require('passport');
// Test route to see if logged in user is matt
router.get('/testAuth', passport.authorize('jwt', { session: false }), function(req, res) {
console.log(req.user);
if (req.user) {
if(req.user.username == "matt") {
res.send("You are matt!");
} else {
res.send("You are not matt!");
}
} else {
res.send("no req.user");
}
})
module.exports = router;