开发者问题收集

使用 express-jwt 无法获取 req.user 对象

2020-10-08
2246

以下是我使用 express-jwt 的设置:

exports.requireSignin = expressJwt({
   secret: process.env.JWT_SECRET,
   algorithms: ["HS256"], 
   userProperty: "auth"
 });

我正在使用它访问秘密路由进行测试,但是我没有在此处的路由中获取 req.user 属性。它导致一个空对象(未定义)。

router.get("/secret",requireSignin,(req, res) => {
    res.json({
        message: req.user,
    });
});

我正在使用 Postman 进行测试并将带有授权标头的令牌作为承载令牌发送。

3个回答

我也被这个练习难住了。要解决这个问题,请改用 req.auth,如下所示:

router.get("/secret",requireSignin,(req, res) => {
    res.json({
        user: req.auth,
    });
   
});

希望它有用。祝你好运。

Kevin Narsh
2020-10-16

requestProperty 决定解码后的令牌的存储位置,对于 express-jwt 版本 < 6,默认情况下为 user ,现在为 auth 。如果您希望 req.user 不未定义,请尝试:

import { expressjwt } from 'express-jwt';

exports.requireSignin = expressjwt({
   secret: process.env.JWT_SECRET,
   algorithms: ["HS256"], 
   requestProperty: "user",
 });

或者在当前设置中使用 req.auth 代替 req.user

Sylhare
2023-06-09

您没有从请求中验证/解码您的 JWT 令牌,解码后,将其分配给 req 对象并调用 next()

const JWT = require('jsonwebtoken')

module.exports.requireSignin = (req, res, next) => {
  const token = req.headers.authorization

  if (!token) {
    res.status(400).json({ status: false, message: 'Token required' })
  }

  JWT.verify(token, process.env.JWT_SECRET, (err, decoded) => {
    if (err) {
      console.log(`JWT: ${err.message}`)
      return res
        .status(401)
        .json({ status: false, error: 'Token is not valid' })
    }
    req.user = decoded
    next()
  })
}

哦,您正在使用 express-jwt 包。我一开始没看出来我的答案是关于如何在 req 中获取令牌有效负载对象的一般性答案。希望它能在未来帮助到别人。

Rohit Ambre
2020-10-08