Назад | Перейти на главную страницу

как аутентифицировать несколько поддоменов в nginx с одним логином

у нас есть приложение, состоящее из нескольких частей. Каждая часть работает на своем поддомене (сайт nginx). Мы хотели бы скрыть доступ dev env за некоторой общей аутентификацией, когда первый вход в любой из поддоменов будет предоставлять доступ и другим.

Наша первая идея заключалась в том, чтобы разместить прокси-сайт 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.

Вы можете попробовать использовать модуль auth_basic на http уровень контекста, чтобы применить его к каждому виртуальному хосту:

http {

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

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