You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JWT verify校验时如何跳过过期检查仅验证令牌合法性

解决方案

你当前使用的NestJS JwtService 底层基于jsonwebtoken库实现,官方原生提供了跳过过期时间校验的配置项,不需要自己写额外的异常分支兼容。
直接在verifyAsync的配置参数中加入ignoreExpiration: true即可:开启该配置后,校验逻辑会完全跳过对exp过期声明的检查,但依然会验证令牌签名是否正确、令牌格式是否合法、其他自定义校验规则(比如签发人、接收方如果配置了的话)是否匹配,完全满足你的需求。

调整后的代码实现

async refreshToken(token: string): Promise<{ token: string } | ErrorDetails> {
  if (!token)
    throw new HttpException('No token provided', HttpStatus.BAD_REQUEST)

  token = token.split(' ')[1]
 
  const jwtToken = await this.jwtService
    .verifyAsync(token, {
      secret: process.env.JWT_SECRET,
      ignoreExpiration: true // 新增该配置跳过过期校验
    })
    .catch(() => {
      // 此处捕获的都是签名无效、令牌格式篡改等真正的非法错误
      throw new HttpException('Invalid token', HttpStatus.FORBIDDEN)
    })

  const user = await this.userService.findUserByAllFields(jwtToken.user)
  if (!user) throw new HttpException('Invalid token', HttpStatus.FORBIDDEN)

  const userDetails = this.userService._getUserDetails(jwtToken.user)
  const jwt = await this.jwtService.signAsync({ userDetails })

  return { token: jwt }
}

安全提示

  • 跳过过期校验不代表要完全放弃过期逻辑,建议校验通过后手动读取令牌payload中的exp字段做二次判断:比如只允许过期时间不超过7天的令牌执行刷新操作,避免令牌泄露后被无限期用来换发新令牌
  • 不要使用jwtDecode这类只解码不验签的方法绕开校验,很容易遗漏签名校验步骤引入安全漏洞,使用官方提供的配置项是最稳妥的实现方式

内容的提问来源于stack exchange,提问作者JuleZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:48:18