繁体   English   中英

Passport JWT req.user 在我的路线之一中未定义

[英]Passport JWT req.user is undefined in one of my routes

我有一个绝对的噩梦,试图用我的快递应用程序设置 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);

}

护照作为参数传递给这个,然后在主快递文件中初始化

这是 /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;

不过,在这个文件中,对于向 GET /api/testAuth 发送请求的 api 路由,使用与以前完全相同的令牌和相同的标头,我没有返回 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;

req.user对象仅在您使用使用会话的护照身份验证策略时设置。 在这种情况下,身份验证是无状态的,因为您已指定{session: false} ,这应该是 api 的方式。 因此,会话没有用户对象。 以下是我在passport.authenticate中间件中设置我的req.user对象的方法:

  1. 修改您的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) };
  2. 修改 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都将在身份验证成功后收到req.user

您在 testAuth 路由中使用了passport.authorize ,这适用于已经登录并具有会话信息的用户。 由于您没有使用会话存储,因此您没有持久的req.user对象,因此应该在所有路由上使用passport.authenticate

http://passportjs.org/docs/authorize

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM