可通过nginx的auth_request模块配合独立认证服务实现统一安全认证界面,核心是nginx将受保护请求转发至认证服务校验,根据200/401/403响应决定放行或跳转登录页,并透传用户信息、共享sso会话、强化安全防护。

可以通过 Nginx 的 auth_request 模块配合一个独立的认证服务,实现统一的安全认证界面。核心思路是:Nginx 不直接处理登录逻辑,而是将所有受保护请求先“转发”给一个专门的认证服务(如 OAuth2 Proxy、Keycloak Gatekeeper 或自建登录页),由该服务决定是否放行,并返回标准 HTTP 状态码(如 200 表示通过,401/403 拒绝)。Nginx 根据响应结果决定是否代理到后端应用,或重定向到统一登录页。
配置 auth_request 拦截并委托认证
Nginx 将 /login、/oauth/callback 等路径排除在外,其余路径都通过 auth_request 指令交由认证服务校验:
- 在 server 块中添加 auth_request /auth,表示所有匹配 location 都需先验证
- 定义内部 location /auth,用 proxy_pass 转发请求到你的认证服务(例如 http://127.0.0.1:8080/auth)
- 认证服务需返回 200(带必要头信息如 X-User、X-Email)表示合法,否则返回 401/403,Nginx 自动拦截后续流程
统一登录页跳转与会话保持
当 auth_request 返回 401 时,Nginx 默认返回 401 错误页。要跳转到统一登录页,需配置 error_page 401 = @login:
- @login 是一个命名 location,内部用 return 302 + 登录 URL(如 https://sso.example.com/login?rd=$scheme://$host$request_uri)
- 登录成功后,认证服务应设置安全 Cookie(HttpOnly、Secure、SameSite=Lax)并重定向回原始地址
- 建议在 auth_request 后添加 auth_request_set $user $upstream_http_x_user,方便透传用户标识到后端
支持多应用共享认证状态
统一界面的前提是单点登录(SSO)能力。关键在于认证服务与各业务系统共用同一套会话机制:
- 所有业务域名(app1.example.com、app2.example.com)均配置相同的 SSO 域名(sso.example.com)作为认证中心
- Nginx 反向代理时,确保传递 Host、X-Forwarded-* 等头,避免认证服务误判来源
- 若使用 JWT 或 session cookie,需保证密钥/存储后端一致;推荐用 Redis 共享 session,或由认证服务签发可校验的 access_token
补充安全加固细节
仅做跳转和透传还不够,还需防止绕过和信息泄露:
- 禁用对 /auth 接口的外部直接访问:在 /auth location 中加 internal;
- 限制认证服务只接受来自本机 Nginx 的请求(如用 allow 127.0.0.1; deny all;)
- 为所有敏感 header 设置 proxy_hide_header(如 Set-Cookie、Server),避免后端暴露内部信息
- 启用 SSL/TLS,并强制 HSTS;登录页必须 HTTPS,且 rd 参数需校验 referer 或签名防篡改











