Nginx反向代理后访问NestJS认证接口返回401错误如何解决?
问题解决方案
你遇到的401错误和NestJS LocalStrategy的配置无关,本地直连运行正常已经说明业务逻辑没有问题,故障点100%出在Nginx反向代理的配置上,按以下步骤排查修改即可:
核心故障原因
passport-local策略默认会从请求体req.body中提取你配置的userLogin、userPassword字段做校验,Nginx反向代理配置错误会导致请求体丢失、请求头被篡改,NestJS拿不到有效参数就会直接抛出401未授权错误。
具体修复方案
1. 修改Nginx反向代理配置
在你转发NestJS服务的location块中补充以下配置:
location / { proxy_pass http://你实际的NestJS服务地址(比如http://127.0.0.1:3000); # 基础转发头配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 关键配置:完整转发请求体和请求头 proxy_pass_request_body on; proxy_pass_request_headers on; client_max_body_size 10m; # 按需调整允许的最大请求体大小,避免大请求被Nginx拦截 # 如果后续用Authorization头做身份认证,补充以下配置 proxy_set_header Authorization $http_authorization; proxy_pass_header Authorization; }
修改后执行nginx -s reload重载配置即可生效。
2. 验证修复效果
可以临时在登录接口增加日志打印,确认请求体是否正常转发:
@Public() @UseGuards(LocalAuthGuard) @Post('auth/login') async login(@Request() req) { console.log('收到的请求参数:', req.body); // 走Nginx转发时这里能正常打印userLogin、userPassword参数就说明配置生效 return this.authService.login(req.user); }
如果日志打印的请求体为空,就再检查Nginx的配置是否有其他规则过滤了POST请求的参数。
内容的提问来源于stack exchange,提问作者JEKES
相关产品推荐
相关产品推荐

