1

我使用passport jwt策略,这是我的代码片段:

'use strict';

const config = require('../config');
const User = require('../models/user.model');
const passportJWT = require('passport-jwt');

const ExtractJwt = passportJWT.ExtractJwt;
const JwtStrategy = passportJWT.Strategy;

const jwtOptions = {
    secretOrKey: config.secret,
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
};

const jwtStrategy = new JwtStrategy(jwtOptions, (jwtPayload, done) => {
    console.log(jwtPayload);
    User.findById(jwtPayload.sub, (err, user) => {
        if (err) return done(err, null);
        if (user) {
            return done(null, user)
        } else {
            return done(null, false)
        }
    })
});

exports.jwtOptions = jwtOptions;
exports.jwt = jwtStrategy;

在这里,我正在制定策略,一切正常。现在我想创建端点以添加从令牌中检索到的 UserId 的文章(文章在其架构中具有 userId 字符串)。

我想如何从令牌中获取 userId?

它已经发生了,new JwtStrategy因为我有有效负载允许我对findById调用进行身份验证,但我应该以某种方式重用这个文件还是创建新的命名,例如 getUserId?

4

3 回答 3

0

在签署JWT(创建新令牌)时,如果您要在jwt payload以下内容中添加用户信息:

..
....
const payload = {
        userId: user.id,
        email: user.email
      };
      // CREATE A JWT TOKEN
      jwt.sign(payload, secretForJWT, { expiresIn: expirationTimeForJWT },
        (err, token) => {
....
..

然后您应该能够userId从解密的令牌中检索该字段,如下所示:

const jwtStrategy = new JwtStrategy(jwtOptions, (jwtPayload, done) => {
    console.log(jwtPayload);
    const userId = jwtPayload.userId; // YOU SHOULD GET THE USER ID FROM THE PAYLOAD
    User.findById(jwtPayload.sub, (err, user) => {
        if (err) return done(err, null);
        if (user) {
            return done(null, user)
        } else {
            return done(null, false)
        }
    })
});

exports.jwtOptions = jwtOptions;
exports.jwt = jwtStrategy;
于 2019-06-24T05:37:52.323 回答
0

标识呈现 JWT 的用户的 JWT 声明是sub. 如果正确理解您的代码,jwtPayload.sub则包含此声明。

如果sub声明的值包含您所称的用户 ID,那么您就完成了。

如果您想根据不同的值(可能源自 的值)查找用户sub,您必须告诉我们这个不同的值与 JWT 中包含的声明有何关联。

于 2019-06-17T06:48:11.217 回答
0

这是我的方法,希望对您有所帮助:

const jwt = require('jsonwebtoken');
...
const jwt_payload = jwt.decode(yourJwtInString);
const id = jwt_payload._id;
...
于 2021-06-25T02:05:17.353 回答