如何使用一次登录验证 Nginx 中的多个子域名

如何使用一次登录验证 Nginx 中的多个子域名

我们的应用程序由几个部分组成。每个部分都在其子域(nginx 站点)上运行。我们希望将开发环境的访问权限隐藏在某些共享身份验证后面,这样首次登录任何子域的用户都将获得访问权限。

我们的第一个想法是将包含所有域的 nginx 代理站点放在前面,并在那里设置基本身份验证,然后代理传递通信。部分方法是可行的。问题是基本身份验证与域名绑定,因此在登录一个子域后,我必须在第一次访问时为每个子域输入凭据。

我们使用了简化的示例配置,但它并没有按照预期的方式工作。

server {
    listen 443 ssl http2;

    server_name paapi-xy.example.com;

    access_log /var/www/access_api_443.log;
    error_log /var/www/error_api_443.log debug;

    ssl_certificate /etc/ssl/example/example.com.chained.crt;
    ssl_certificate_key /etc/ssl/example/example.com.key;

    ssl_session_timeout 1d;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    root /var/www/html;

    location / {
        try_files $uri /index.api.html;
    }
}

server {
    listen 443 ssl http2;

    server_name pawww-xy.example.com;

    access_log /var/www/access_www_443.log;
    error_log /var/www/error_www_443.log debug;

    ssl_certificate /etc/ssl/example/example.com.chained.crt;
    ssl_certificate_key /etc/ssl/example/example.com.key;

    ssl_session_timeout 1d;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    root /var/www/html;

    location / {
        try_files $uri /index.www.html;
    }        
}

server {
    listen 443 ssl http2;

    server_name paapi.example.com pawww.example.com;

    access_log /var/www/access_proxy_443.log;
    error_log /var/www/error_proxy_443.log debug;

    ssl_certificate /etc/ssl/example/example.com.chained.crt;
    ssl_certificate_key /etc/ssl/example/example.com.key;

    ssl_session_timeout 1d;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    root /var/www/html;

    set $xheader "someignoredvalue";

    location / {
        satisfy any;

        auth_basic example_auth;
        auth_basic_user_file /var/www/.htpasswd;

        include proxy_params;

        if ($host = paapi.example.com) {
            proxy_pass                    https://paapi-xy.example.com;
            set $xheader paapi-xy.example.com; 
        }

        if ($host = pawww.example.com) {
            proxy_pass                    https://pawww-xy.example.com;
            set $xheader pawww-xy.example.com; 
        }

        proxy_set_header Host $xheader;
    } 
}

有谁对如何实现这一点有其他的想法吗,类似于 SingleSignOn。

答案1

您可以尝试使用auth_basic 模块http上下文级别将其应用于每个虚拟主机:

http {

    auth_basic             "Administrator’s Area";
    auth_basic_user_file   conf/htpasswd;

    server { ... }
    server { ... }
    server { ... }
}

相关内容