Nestjs中JwtStrategy的validate方法不生效,payload为undefined返回401
Nest JWT Strategy validate函数payload为undefined/返回401问题解决方案
- 校验请求头格式正确性
Postman请求的Authorization字段必须严格遵循Bearer 你的令牌格式,Bearer与令牌间必须有1个英文空格,令牌无多余字符。可先将令牌粘贴至本地解析工具确认令牌本身有效、签名密钥与代码中配置的mysecretkey一致,且未过期。 - 检查令牌生成逻辑
调用jwtService.sign()生成令牌时,必须传入合法的payload对象,禁止传入undefined、null或非对象类参数,正确示例:// 登录接口生成token示例 async login(userInfo: UserEntity) { const payload = { userId: userInfo.id, username: userInfo.username }; return { access_token: this.jwtService.sign(payload), expiresIn: 3600000 }; } - 补全validate函数逻辑
你贴出的代码中validate函数未闭合且无返回值,Passport要求validate函数必须返回合法用户对象,返回null/undefined时会直接抛出401错误,完整写法参考:@Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { constructor( private userService:UserService ) { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), ignoreExpiration: false, secretOrKey: "mysecretkey", }); } async validate(payload:any) { // 建议使用逗号分隔打印参数,避免字符串拼接导致的显示异常 console.log('this is payload', payload) const existUser = await this.userService.findOneById(payload.userId); if(!existUser) { throw new UnauthorizedException('用户不存在'); } return existUser; } } - 确认守卫装饰器配置
需要鉴权的接口必须添加@UseGuards(AuthGuard('jwt'))装饰器,才能触发JwtStrategy的校验逻辑。
内容的提问来源于stack exchange,提问作者Med
相关产品推荐
相关产品推荐

