首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法在nginx中使用多个auth_request指令?

是否有方法在nginx中使用多个auth_request指令?
EN

Stack Overflow用户
提问于 2017-08-22 16:13:44
回答 2查看 2.3K关注 0票数 16

我想使用多个auth_request指令来尝试使用多个服务器进行身份验证--也就是说,如果第一个auth服务器返回403,那么尝试第二个auth服务器。我尝试了这样一种简单的方法:

代码语言:javascript
复制
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不解析配置文件。我收到了回复

代码语言:javascript
复制
nginx: [emerg] "auth_request" directive is duplicate

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-28 16:09:03

下面是我的解决方案,在google中找到这个问题,寻找相同的东西:

  • 设置将传递回nginx服务器的上游服务器。
  • 让这些上游服务器执行您/auth-1和/auth-2端点所做的操作,除非它们在身份验证错误时返回503 (除了链中的最后一个返回401以向nginx发出不再需要尝试的服务器的信号)。
  • 告诉/auth上的nginx只使用这个上游,所以它将依次尝试所有身份验证“服务器”(感谢503个返回代码),直到其中一个成功或最后一个返回401。
代码语言:javascript
复制
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;
    }
    # ...
}
票数 3
EN

Stack Overflow用户

发布于 2022-11-08 18:41:23

我也遇到了类似的问题,但我找到了一种不同的解决方案,在某些情况下可能是可以接受的。它本质上创建了一个双代理层,它具有显著的性能损失。第一代理层用于“身份验证”,第二代理层用于“授权”。

下面的配置是未经测试的,目的是传达概念,而不是一个工作示例。

代码语言:javascript
复制
### 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
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45822565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档