护照JWT要求.在我的一条路由中没有定义用户
Passport JWT req.user is undefined in one of my routes
我有一个绝对的噩梦试图设置JWT与我的快递应用程序!我想我已经把它大部分工作了,我有一个注册路由和登录路由,都能正常工作并生成有效的令牌,我在我的"/users"路由中有另一个路由,我用它来测试身份验证,这一切都很好。但是我有另一个包含'/api'的路由的文件,这是身份验证实际上很重要的地方,我有一个类似的测试路由,试图访问请求。用户(就像我在我的其他路线),但它似乎是要求。用户未定义。通过一些调试,看起来用户是需要的。这很奇怪,我不明白为什么它不在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);
}
passport作为this的参数传递,然后在主express文件
中初始化。这里是/users路由文件,这很好。发送一个GET请求到/users/isAuth与授权头和'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;
在这个文件中,对于api路由发送请求到GET/api/testAuth与以前完全相同,具有相同的令牌和相同的头,我没有得到任何请求。在控制台中,我看到了这个请求。用户未定义。但在控制台似乎有用户对象,就像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;
req.user
对象仅在使用使用会话的护照认证策略时设置。在这种情况下,身份验证是无状态的,因为您已经指定了{session: false}
,这对于api来说应该是这样的。因此,会话没有user对象。以下是我如何在passport.authenticate
中间件中设置req.user
对象:
-
修改您的
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, //<= Important, so that the verify function can accept the req param ie verify(req,payload,done) };
-
修改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); } }); });
就是这样:现在任何具有passport.authenticate("jwt", {session: false})
中间件的路由都将在成功认证后接收req.user
。
您在testAuth路由中使用passport.authorize
,这是针对已经登录并拥有会话信息的用户。因为你没有使用会话存储,所以你没有一个持久的req.user
对象,所以应该在所有路由上使用passport.authenticate
- Meteor-添加用户自定义字段的方法不起作用
- 如何在用户按下F5键或单击浏览器时显示自定义的fancybox's后退/关闭按钮
- Can用户'MediaWiki上的自定义JavaScript调用Lua模块
- 如何获取用户's输入并返回我定义的匹配变量的值
- 使用具有用户定义字段的新请求者创建新的Zendesk票证
- jquery返回ajax响应和用户定义的变量到函数
- 阻止用户在Netsuite中使用标准/未自定义的表单
- 如何使用用户定义的值来增加Javascript中的值
- Angular 2中组件的自定义用户模板
- 从自定义用户控件更新contenttemplate下页面中控件的id
- 从 JQuery 添加 asp.net 自定义用户控件
- 将自定义用户代理关联到特定的谷歌浏览器页面/标签页
- 当使用ajax请求时,是否可以自定义用户代理参数
- 为什么人们要在jQuery对象中添加自己的自定义/用户函数
- 护照JWT要求.在我的一条路由中没有定义用户
- 用自定义用户界面设备钩入openseaddragon
- 自定义用户HTML输入安全性
- 扩展解析.用户转换为自定义用户类
- 如何将自定义用户数据添加到流星帐户
- Alfresco ECM的自定义用户界面