ima*_*cus 1 javascript node.js express jwt passport.js
尝试通过我的Express应用程序设置JWT真是一场噩梦!认为我现在大部分工作了,我有一个注册路由和登录路由,它们都可以正常工作并生成有效的令牌,并且我的“ / users”路由中还有另一个路由,可以用来测试身份验证,这一切都很好。但是我还有另一个文件,其中包含“ / api”的路由,这在身份验证中实际上很重要,并且我有一个类似的测试路由尝试访问req.user(就像我在其他路由中所做的一样),但看起来像req。用户未定义。通过一些调试,看起来用户位于req.account中,这很奇怪,我不明白为什么它不在req.user中
我在/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);
}
Run Code Online (Sandbox Code Playgroud)
护照作为参数传递给该护照,然后在主要快递文件中初始化
这是/ users路由文件,可以正常工作。使用Authorization标头向/ users / isAuth发送GET请求,并且'JWT'正常工作,我将用户名发回给我
"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;
Run Code Online (Sandbox Code Playgroud)
但是在此文件中,对于api路由,使用相同的令牌和相同的标头将请求发送至GET / api / testAuth与以前完全相同,我没有得到req.user,在控制台中,我看到req.user是未定义的。但是在控制台中,似乎确实像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;
Run Code Online (Sandbox Code Playgroud)
req.user仅当您使用使用会话的通行证身份验证策略时设置对象。在这种情况下,由于您已指定{session: false},因此身份验证是无状态的,这对于api应该是这样的。因此,会话没有用户对象。这是我req.user在passport.authenticate中间件中设置对象的方式:
修改游览jwtOptions以启用将req对象传递给JwtStrategy函数:
const jwtOptions = {
// Telling Passport to check authorization headers for JWT
jwtFromRequest: ExtractJwt.fromAuthHeader(),
// Telling Passport where to find the secret
secretOrKey: config.secret,
passReqToCallback: true,
};
Run Code Online (Sandbox Code Playgroud)修改您的JwtStrategy的参数,使其包含请求对象作为第一个参数;然后在该if (user)块中,只需将返回的用户对象分配给req.user:
const jwtLogin = new JwtStrategy(jwtOptions, function(req, payload, done) {
User.findById(payload._id, function(err, user) {
if (err) { return done(err, false); }
if (user) {
req.user = user; // <= Add this line
done(null, user);
} else {
done(null, false);
}
});
});
Run Code Online (Sandbox Code Playgroud)就是这样:现在,具有passport.authenticate("jwt", {session: false})中间件的任何路由都将req.user在身份验证成功后接收。
| 归档时间: |
|
| 查看次数: |
3744 次 |
| 最近记录: |