nginx 通过 auth_request 模块将鉴权委托给第三方服务:定义 internal /auth 位置处理子请求,透传 uri、方法、authorization 等头信息,启用 auth_request /auth 指令保护路径,提取响应头如 x-user-id 并转发,依据 200/401/403 状态码放行或拦截。

直接在 Nginx 配置中启用 auth_request 模块,本质是让 Nginx 做“守门人”:不自己验 token、不查数据库,而是悄悄发一次子请求给你的第三方鉴权服务,只看它返回 200 就放行,401 或 403 就拦住。整个过程对业务透明,也不改后端代码。
定义内部鉴权入口(必须加 internal)
这是安全底线,防止攻击者绕过网关直连鉴权接口:
- 用
location = /auth或类似路径定义子请求目标 - 必须加上
internal;—— 外部请求无法直接访问该地址 - 关闭请求体传输:
proxy_pass_request_body off;+proxy_set_header Content-Length "";(除非鉴权服务明确需要 body) - 透传关键上下文:
proxy_set_header X-Original-URI $request_uri;、proxy_set_header X-Original-Method $request_method;、proxy_set_header Authorization $http_authorization;
在目标接口启用 auth_request
想保护哪段路径,就在对应 location 块里加一行指令:
-
auth_request /auth;—— 指向上面定义的 internal 地址 - 后面接
proxy_pass http://backend;或其他处理逻辑 - 如果鉴权失败,默认返回 401;可配合
error_page 401 = @login实现自动跳转
提取并透传用户身份信息
第三方服务验证通过后,可在响应头中附带信息(如 X-User-ID: alice、X-Roles: admin,api-read),Nginx 能捕获并转发:
- 用
auth_request_set $user_id $upstream_http_x_user_id;提取响应头值 - 再用
proxy_set_header X-User-ID $user_id;透传给后端服务 - 支持多个字段,比如同时提取 group、scope、tenant 等
错误处理与状态码约定
Nginx 只认 HTTP 状态码,不解析响应体内容:
- 返回 200 → 放行原请求
- 返回 401 → 触发
error_page 401,适合未登录场景(如跳转登录页) - 返回 403 → 直接拒绝,适合已登录但权限不足
- 返回其他非 2xx/401/403 状态(如 500、302)→ Nginx 默认视为失败,可能返回 500











