如何从 nestjs/jwt 令牌中正确提取有效负载?

How to properly extract payload from nestjs/jwt token?

我运行在一个项目中遇到解密令牌的问题,我想从传入的令牌中提取数据,将其与数据库中的数据进行比较,然后执行某些操作。 问题是,当我从“jwtService.decode()”获取有效负载时,我无法访问“decodedJwt.email”字段,nest 抱怨“decodedJwt”不是对象。但是如果你 return typeof "decodedJwt" 那么答案就是一个字符串。但是,我无法访问代码本身的“电子邮件”字段。如果我在此函数中 return "decodedJwt",那么在邮递员中我将获得具有必要字段的非常必要的对象,包括相同的“电子邮件”字段。我的错误是什么?

小窝回复: 属性 'email' 在类型 'string | { [key: string]: any; }' 上不存在。 属性“字符串”类型不存在“电子邮件”。ts(2339)

async refreshTokenByOldToken(authHeader: string) {
  const decodedJwt = this.jwtService.decode(authHeader.split(' ')[1])
  return decodedJwt.email
}

您需要转换类型。明确说明它是什么类型。

type PayloadType = {
  email: string;
}

async refreshTokenByOldToken(authHeader: string) {
  const decodedJwt = this.jwtService.decode(authHeader.split(' ')[1]) as PayloadType;
  return decodedJwt.email
}

您也可以参考 PayloadType 其他地方,例如在您的服务中而不是 string | { [key: string]: any; } 您可以 string | PayloadType.

examples of type casting

因为您的 decodedJwt 字符串是不同的数据类型。您访问邮箱信息的两种情况;

  1. 如果你@nestjs/jwt包裹
const decoded: JwtPayload = this.jwtService.decode(yourAccessToken);

const email = decoded.email;

  1. Base 64 转换

    const base64Payload = authHeader.split(" ")[1];    
    const payloadBuffer = Buffer.from(base64Payload, "base64");
    const updatedJwtPayload: JwtPayload = JSON.parse(payloadBuffer.toString()) as JwtPayload;
    
    const email = updatedJwtPayload.email;