You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:06:06