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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:25:09