如何配置Nginx实现请求经App-A校验后转发至App-B的逻辑
Nginx配置实现请求前置鉴权转发逻辑
要实现你描述的「先请求应用A鉴权,再根据结果转发到应用B或返回401」的逻辑,Nginx需要结合auth_request模块处理前置子请求;若必须解析应用A返回的JSON响应体,则需借助OpenResty的Lua模块(原生Nginx无法直接解析JSON响应内容)。下面分两种场景给出配置方案:
场景1:可修改应用A返回对应状态码
如果能调整应用A的逻辑,让它返回{"allowed":true}时同步返回HTTP 200状态码,返回{"allowed":false}时返回HTTP 401状态码,用原生Nginx模块即可实现,配置如下:
server { listen 80; # 定义鉴权子请求的location,仅内部可访问 location = /auth-check { internal; proxy_pass https://app-A.dev/; proxy_pass_request_body off; # 无需转发请求体给鉴权服务时启用 proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; # 传递原始请求URI给应用A } # 主请求处理逻辑 location / { # 发起鉴权子请求 auth_request /auth-check; # 鉴权通过(应用A返回200),转发请求到应用B proxy_pass https://app-B.dev/; # 鉴权失败时返回自定义401响应 error_page 401 = @unauthorized; } # 自定义401响应内容 location @unauthorized { return 401 '{"error":"Unauthorized"}'; add_header Content-Type application/json; } }
场景2:无法修改应用A,需解析JSON响应体
如果不能调整应用A的返回逻辑,必须解析其JSON响应中的allowed字段,需要使用集成了Lua模块的OpenResty来实现,配置示例如下:
server { listen 80; # 鉴权子请求location,调用应用A并解析JSON响应 location = /auth-check { internal; proxy_pass https://app-A.dev/; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; # Lua代码解析响应体,设置鉴权状态码 body_filter_by_lua_block { local json = require("cjson") local body = ngx.arg[1] local res, err = json.decode(body) if res and res.allowed == true then ngx.status = 200 # 鉴权通过,返回200给auth_request else ngx.status = 401 # 鉴权失败,返回401 end ngx.arg[2] = true # 终止响应体处理 } } # 主请求处理逻辑同场景1 location / { auth_request /auth-check; proxy_pass https://app-B.dev/; error_page 401 = @unauthorized; } location @unauthorized { return 401 '{"error":"Unauthorized"}'; add_header Content-Type application/json; } }
关键说明
auth_request:发起内部子请求到鉴权服务,根据子请求的HTTP状态码判断是否允许后续请求。internal指令:标记该location仅允许内部子请求访问,禁止外部直接调用。- Lua解析JSON:需确保OpenResty已安装
cjson库(通常默认包含),用于解析应用A的JSON响应并设置对应状态码。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

