NestJS中JWT Auth Guard返回401 Unauthorized问题求助
按优先级从基础到深层依次排查:
1. 验证请求的Token携带格式
- 确认请求头是否正确携带
Authorization字段,格式必须是Bearer <access_token>,注意Bearer和token之间有空格,格式错误是最常见的401诱因。 - 可用curl快速验证:
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" http://localhost:3000/your-protected-route
2. 核对JWT配置一致性
确保Token生成与认证环节的参数完全匹配:
- 检查
JWT_SECRET(或secretOrKey):生成Token时的密钥必须和JwtModule、JwtStrategy中的配置完全一致,包括拼写、大小写,同时确认环境变量是否正确加载(可启动时打印console.log(process.env.JWT_SECRET)验证)。 - 检查Token有效期:将access_token复制到JWT解析工具查看
exp字段,确认是否已过期。 - 示例配置对比:
Token生成代码:
JwtModule注册配置:this.jwtService.sign({ sub: user.id }, { secret: process.env.JWT_SECRET, expiresIn: '1h' });JwtModule.register({ secret: process.env.JWT_SECRET, signOptions: { expiresIn: '1h' }, })
3. 检查认证守卫逻辑
- 确认
JwtAuthGuard正确继承AuthGuard('jwt'),无错误逻辑覆盖认证流程:@Injectable() export class JwtAuthGuard extends AuthGuard('jwt') {} - 若自定义了
handleRequest方法,检查是否错误返回null或异常:handleRequest(err, user, info) { if (err || !user) { throw err || new UnauthorizedException(); } return user; }
4. 验证JwtStrategy的validate方法
- 确认
validate方法正确返回用户对象,避免因数据库查询失败(如用户已删除)返回null:async validate(payload: any) { const user = await this.userService.findOne(payload.sub); if (!user) { throw new UnauthorizedException(); } return user; } - 核对payload字段匹配度:生成Token时用
sub: user.id,validate环节就要对应使用payload.sub查询,避免字段名写错。
5. 排查依赖与环境变化
- 检查
@nestjs/jwt、passport-jwt等依赖是否自动更新,新版本可能存在配置项变更(如参数名、默认签名算法调整)。 - 确认近期服务器环境是否有变更(如环境变量加载方式、端口/域名调整)。
6. 确认路由守卫装饰器使用
- 确保需要认证的路由正确添加
@UseGuards(JwtAuthGuard)装饰器,无遗漏或位置错误。 - 若搭配角色守卫,需保证JWT守卫优先执行:
@UseGuards(JwtAuthGuard, RolesGuard) @Roles('admin') @Get('/admin') getAdminData() { /* ... */ }
内容的提问来源于stack exchange,提问作者Krittikamas Sunophak
相关产品推荐
相关产品推荐

