如何在 passport-jwt 中获取 rawJWT 字符串?

Posted

技术标签:

【中文标题】如何在 passport-jwt 中获取 rawJWT 字符串?【英文标题】:How to get a rawJWT string in passport-jwt? 【发布时间】:2020-04-01 03:51:00 【问题描述】:

我正在使用 Express.js、Passport.js。 Jsonwebtoken 我在数据库中保存了一个 JWT 编码的令牌。

我想用 Bearer 检查加密的 JWT。

JwtStrategy 允许我们接收 jwtPayload 对象。

但我需要得到一个加密字符串。 该文档包含 rawJwt,但如何获取加密字符串?如何提取?

passport.use(new JwtStrategy(
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey   : config.secretOrKey
  ,
  function (jwtPayload, cb) 
      return User.find(_id: jwtPayload.user._id, token: token)// compare the token that goes in encrypted form
          .then(user => 
              return cb(null, user);
          )
          .catch(err => 
              return cb(err);
          );
  

));

【问题讨论】:

【参考方案1】:

您可以创建自定义提取函数

const jwtExtractor = (req) => 
    let token = null;
    if (req && req.headers) 
        let tokenParts = req.headers.authorization.split(' ');
        // tokenParts tokenParts[0] is schema and tokenParts[1] is credentials
        // test matching schema 
        if (/^Bearer$/i.test(tokenParts[0]))  // use your own schema instead of Bearer 
            token = tokenParts[1];
        
    
    // Declare token globally to use it out side the function, eg: as `Bearer $token` or as token
    // or you can store it to another global variable, eg: jwtString = req.headers.authorization
    return token;
;

并作为 jwtFromRequest: jwtExtractor,

传递
let opts = ;
opts.jwtFromRequest = jwtExtractor;
opts.secretOrKey = 'secret';
module.exports = (passport) => 
    passport.use(
        new JWTStrategy(opts, (jwtPayload, done) => 
            UserModel.findOne(_id: jwtPayload.id)
                .then((user) => 
                    // Here you can check the token with the stored token in DB
                    if (user && user.jwtToken === `Bearer $token`) 
                        return done(null, jwtPayload);
                     else return done(null, false);
                )
                .catch((err) => 
                    return done(null, false);
                );
        )
    );
;

更多详情请参考this answer

【讨论】:

以上是关于如何在 passport-jwt 中获取 rawJWT 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs Express passport-jwt 从令牌中获取错误的用户

使用angular 7时无法使用passport-jwt在快递Js中进行授权

在获取用户时使用 Passport-jwt 时 req.user 未定义

如何使用 passport-jwt 验证路由?

如何使用 passport-jwt 正确检查令牌有效负载?

我可以有条件地使用passport-jwt吗?