如何从已经创建的 jwt.verify() 方法的结果中获取属性
Posted
技术标签:
【中文标题】如何从已经创建的 jwt.verify() 方法的结果中获取属性【英文标题】:how can get the property from result of jwt.verify() method that was already created 【发布时间】:2021-09-02 13:58:32 【问题描述】:在我的 node.js 项目中,我使用了 typescript。
我想从jwt.verify()
的结果中得到userId
,但出现错误。
我该如何解决这个问题? (如果我不使用打字稿,没有问题。)
userService.ts 文件:
在登录方法中,我有以下代码:
import jwt from "jsonwebtoken";
// I have defined userId
token = jwt.sign( userId: userId, email: email , secretKey, expiresIn: expiresIn );
check-auth.ts 文件:
我还有 check-auth 中间件:
import jwt from "jsonwebtoken";
const decodedToken = jwt.verify(token, process.env.SECRET_KEY);
// Property 'userId' does not exist on type 'string | object'.
// Property 'userId' does not exist on type 'string'.ts(2339)
req.userData = userId: decodedToken.userId ; // I need to access to the userId
【问题讨论】:
【参考方案1】:问题是jwt.verify
不知道编码的token
字符串中可能包含什么。事实上,任何东西都可能用正确的密钥签名。所以你必须提示 TS 关于预期的类型。作为最快速的解决方案:
type MyToken =
userId: string
email: string
iat: number
exp: number
const decodedToken = jwt.verify(token, process.env.SECRET_KEY) as MyToken;
req.userData = userId: decodedToken.userId ; // ok
虽然对于生产代码,我会使用 assertion function 之类的东西来验证解码令牌的内容:
type MyToken =
userId: string
email: string
iat: number
exp: number
const decodedToken: unknown = jwt.verify(token, process.env.SECRET_KEY);
function verifyDecodedToken(data: unknown): asserts data is MyToken
if (!(data instanceof Object))
throw new Error('Decoded token error. Token must be an object');
if (!('userId' in data))
throw new Error('Decoded token error. Missing required field "userId"');
// other necessary checks
verifyDecodedToken(decodedToken);
req.userData = userId: decodedToken.userId ; // ok
playground link
【讨论】:
【参考方案2】:替换
从“jsonwebtoken”导入jwt;
与
从“jsonwebtoken”导入*作为jwt;
// example,
import * as jwt from "jsonwebtoken";
let secretKey = "test";
let token = jwt.sign( userId: "test", email: "test@test.com" ,secretKey, expiresIn: 300000 );
const decodedToken = jwt.verify(token, secretKey);
let result = userId: decodedToken.userId ; // I need to access to the userId
console.log(result);
【讨论】:
以上是关于如何从已经创建的 jwt.verify() 方法的结果中获取属性的主要内容,如果未能解决你的问题,请参考以下文章
如何导入jsonwebtoken的verify抛出的TokenExpiredError?