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
相关产品推荐
相关产品推荐

