0

在 nestjs 中,我通过创建有效负载对象并对其进行签名来创建 JWT(令牌)。像这样的东西:

    const jwtPayload: JwtPayload = 
    {
      iss:                issuer,
      sub:                info,
      aud:                audience,
   // exp:                - populated by fn: this.jwtService.sign(payload),
   // iat:                - populated by fn: this.jwtService.sign(payload),
      jti:                'XXXX1234' 
    }

const signedJwtAccessToken: string = this.jwtService.sign(jwtPayload); 

Nest 将 jwtPayload 编码为字符串。

对于清理工作,我想知道 JWT 的确切到期时间。这会被 .sign() 函数自动编码到 ' signedJwtAccessToken ' - 属性.exp - 中。

要在签名后立即访问它,需要对其进行解码。

在签名后立即以相同方法解码signedJwtAccessToken的最简单方法是什么?

笔记:

当 JWT 从客户端返回时,nestjs 在访问 fn: validate() 时对其进行解码,但我想在签名后立即解码 - 在向客户端发送响应之前,例如:

                            // signing - encoding
const signedJwtAccessToken: string = this.jwtService.sign(jwtPayload);

                            // decoding
const decodedJwtAccessToken: string = decodeJwt(signedJwtAccessToken);

                            // parsing back to an object
const updatedJwtPayload: JwtPayload  = JSON.parse(decodedJwtAccessToken);

                            // reading property of .exp
const expires = updatedJwtPayload.exp;
4

1 回答 1

1

只需将其解码为普通的 jwt 令牌即可。如果你使用nestjs-jwt包,只需调用decode函数:

const decodedJwtAccessToken: JwtPayload = this.jwtService.decode(signedJwtAccessToken);

const expires = decodedJwtAccessToken.exp;

或者只是将令牌解码为 base64 字符串

const base64Payload = signedJwtAccessToken.split('.')[1];
const payloadBuffer = Buffer.from(base64Payload, 'base64');
const updatedJwtPayload: JwtPayload = JSON.parse(payloadBuffer.toString()) as JwtPayload;
const expires = updatedJwtPayload.exp;
于 2021-11-10T02:17:02.087 回答