有没有办法在nginx中使用多个auth_request指令?

xdyibdwo  于 2022-11-21  发布在  Nginx
关注(0)|答案(2)|浏览(166)

我想使用多个auth_request指令来尝试在多个服务器上进行身份验证--也就是说,如果第一个身份验证服务器返回403,则尝试第二个身份验证服务器。

location /api {
    satisfy any;
    auth_request    /auth-1/;
    auth_request    /auth-2/;
    proxy_pass http://api_impl;
}

location /auth-1/ {
    internal;
    proxy_pass              http://auth_server_1;
    proxy_pass_request_body off;
    proxy_set_header        Content-Length "";
    proxy_set_header        X-Original-URI $request_uri;
}

location /auth-2/ {
    internal;
    proxy_pass              http://auth_server_2;
    proxy_pass_request_body off;
    proxy_set_header        Content-Length "";
    proxy_set_header        X-Original-URI $request_uri;
}

但是nginx不能解析配置文件。

nginx: [emerg] "auth_request" directive is duplicate

有没有办法在nginx中实现这样的功能?

zkure5ic

zkure5ic1#

这里 是 我 的 解决 方案 后 , 发现 这个 问题 在 谷歌 寻找 同样 的 东西 :

  • 设置 将 传递 到 回送 nginx 服务 器 的 上游 服务 器
  • 让 这些 上游 服务 器 执行/auth - 1 和/auth - 2 端点 执行 的 操作 , 除了 它们 在 身份 验证 错误 时 返回 * * 503 * * ( 除了 链 中 的 最 后 一 个 服务 器 , 它 仍然 返回 401 , 以 向 nginx 发出 没有 更多 服务 器 可 供 尝试 的 信号 )
  • 告诉 /auth 上 的 nginx 只 使用 这个 上游 , 所以 它 将 依次 尝试 所有 的 身份 验证 " 服务 器 " ( 由于 返回 代码 503 ) , 直到 其中 一 个 成功 或 最 后 一 个 返回 401 。
upstream auth {
    server 127.0.2.1:8000 max_fails=0;
    server 127.0.2.1:8001 max_fails=0;
    server 127.0.2.1:8002 max_fails=0;
}

# Method 1
server {
    listen 127.0.2.1:8000;

    location / {
        proxy_pass              http://auth_server_1; # Returns **503** on failure
        proxy_pass_request_body off;
        proxy_set_header        Content-Length "";
        proxy_set_header        X-Original-URI $request_uri;
    }
}

# Method 2
server {
    listen 127.0.2.1:8001;

    location / {
        proxy_pass              http://auth_server_2; # Returns **503** on failure
        proxy_pass_request_body off;
        proxy_set_header        Content-Length "";
        proxy_set_header        X-Original-URI $request_uri;
    }
}

# Method 3
server {
    listen 127.0.2.1:8002;

    location / {
        proxy_pass              http://auth_server_3; # Returns **401** on failure
        proxy_pass_request_body off;
        proxy_set_header        Content-Length "";
        proxy_set_header        X-Original-URI $request_uri;
    }
}

server {
    # ...
    location /api {
        auth_request    /auth;
        proxy_pass http://api_impl;
    }

    location /auth {
        proxy_pass http://auth/;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URL $request_uri;
        proxy_next_upstream error timeout http_503;
    }
    # ...
}

中 的 每 一 个

bnl4lu3b

bnl4lu3b2#

我也遇到过类似的问题,但我找到了一个不同的解决方案,在某些情况下可能是可以接受的。它本质上创建了一个双代理层,这对性能有很大的影响。第一个代理层用于“身份验证”,第二个代理层用于“授权”。
以下配置未经测试,旨在传达概念,而非工作示例。

### What I wanted

location /protected_path {
    auth_request /authenticate; # Login to IDP
    auth_request /authorize;    # Apply Role/Group based authorization
    # Final routing logic
}

### My solution

server {
    listen 443;
    location /protected_path {
        auth_request /authenticate;
        auth_request_set $idp-data $arbitrary_data_from_idp_server;
        proxy_pass http://localhost:8000;
        proxy_set_header Arbitrary-Header $idp-data;
    }
}

server {
    listen 127.0.0.1:8000;
    location /protected_path {
        auth_request /authorize;
        # Final routing logic
    }
}

相关问题