如何从已经创建的 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() 方法的结果中获取属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jwt 令牌获取用户 ID

如何使用 jwt 令牌获取用户 ID

如何导入jsonwebtoken的verify抛出的TokenExpiredError?

Flask 学习-32.flask_jwt_extended 自定义装饰器

PyJWT 引发签名验证失败

JWT 给 JsonWebTokenError “无效令牌”