如何从已经创建的jwt.verify()方法的结果中获取属性



在我的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文件:

同样在检查身份验证中间件我有:

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

问题是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

尽管对于生产代码,我会使用类似断言函数的东西来验证解码令牌的内容:

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

游乐场连接

更换

从";jsonwebtoken";;

使用

从";jsonwebtoken";;

// 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);

相关内容

  • 没有找到相关文章

最新更新