Hapi-auth-jwt2令牌过期返回500错误而非401问题求助
问题根因
- 你配置的
validate方法未被调用属于预期行为:hapi-auth-jwt2的执行逻辑是先调用底层jsonwebtoken库完成令牌签名、有效期等基础校验,基础校验通过后才会执行用户自定义的validate方法。令牌过期属于基础校验失败,因此不会走到你配置的AuthService.verify逻辑。 - 500错误的触发原因:
hapi-auth-jwt2 v10.2.0修复过期返回401的逻辑时,会给抛出的错误对象附加attributes字段存储认证失败的额外信息,而你配置了全局Joi作为Hapi的校验器,你的响应校验规则未允许attributes字段,因此触发了ValidationError: "attributes" is not allowed,原本的401错误被覆盖为500服务端错误。
解决方法(任选其一即可)
- 方案1:在JWT策略配置中新增错误处理函数,移除导致校验失败的
attributes字段
server.auth.strategy('token','jwt',{ key:JWT_TOKEN, validate: AuthService.verify, verifyOptions:{ algorithms:['HS256'] }, // 新增错误处理逻辑 errorFunc: (err) => { delete err.attributes; return err; } });
- 方案2:调整全局Joi响应校验规则,给错误响应的schema添加
.unknown(true)配置,允许额外字段存在,或者明确允许attributes字段。 - 方案3:在
verifyOptions中添加ignoreExpiration: true配置,跳过底层的有效期校验,你自己在validate方法中判断JWT payload的exp字段是否过期,自定义返回401错误即可。
内容的提问来源于stack exchange,提问作者Tinkeshwar Singh
相关产品推荐
相关产品推荐

