我使用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 String)。
我应该如何从令牌中获取用户ID?在new JwtStrategy
中,这已经发生了,因为我有有效载荷,可以让我findById
来对呼叫进行身份验证,但是应该我以某种方式重用了此文件或创建了一个名为getUserId的新文件?
答案 0 :(得分:0)
标识提交JWT的用户的JWT声明为sub
。如果正确理解您的代码,jwtPayload.sub
会包含此声明。
如果sub
声明的值包含您所谓的用户ID,那么您就完成了。
如果您要根据其他值(也许是从sub
派生的值)来查找用户,则必须告诉我们这个不同的值与JWT中包含的声明有何关系。
答案 1 :(得分: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;
答案 2 :(得分:0)
这是我的方法,希望对您有帮助:
const jwt = require('jsonwebtoken');
...
const jwt_payload = jwt.decode(yourJwtInString);
const id = jwt_payload._id;
...