Настройка Simple#

Данный способ подключения приложения к Blitz Identity Provider можно применять при следующих условиях:

  • Приложение нельзя подключить к Blitz Identity Provider с использованием стандартных протоколов SAML или OIDC.

  • Приложение представляет собой веб-приложение, развернутое в собственной инфраструктуре (On-Premise). Доступ пользователей к приложениям можно организовать через реверсивный прокси-сервер.

Чтобы подключить приложение к Blitz Identity Provider по протоколу Simple, необходимо:

  1. В настройках приложения в консоль управления выбрать протокол Simple и задать его настройки:

    • SSL – настройка, указывающая, производится ли за прокси вызов подключаемого по Simple приложения по HTTP или по HTTPS. Рекомендуется в качестве прокси-сервера, защищающего приложение, использовать существующий веб-сервер приложения, и в таком случае соединение прокси-сервера с приложением будет осуществляться без TLS/SSL шифрования.

    • Селектор формы – задается CSS-селектор, позволяющий определить положение формы входа на странице подключаемого приложения.

    • Селектор поля с логином – задается CSS-селектор, позволяющий определить положение поля ввода логина на странице входа подключаемого приложения.

    • URL выхода по умолчанию (опциональная настройка) – указывает, какой адрес должен вызвать Blitz Identity Provider при необходимости инициировать логаут в подключенном по Simple приложении в случае единого логаута в Blitz Identity Provider.

    • URL для перехода после успешного выхода – указывает, какой адрес должен вызвать Blitz Identity Provider для перенаправления пользователя после успешного логаута, инициированного подключенным по Simple приложением.

    • JavaScript (опциональная настройка) – встраиваемый в страницу входа подключаемого по Simple приложения JS-код, позволяющий обработать полученный от приложения ответ с результатами входа (проверить, что вход произведен успешно) и показать об этом ошибку в Blitz Identity Provider.

    Пример значения:

    var fm = document.querySelector('form[name=login]');
    
    if (fm) {
        document.body.style.display = "none";
        var err = document.getElementById('lost-password');
        var errKey = err && err.innerHTML.indexOf('Incorrect password.') !== -1 ? 'incorrect_password' : 'unknown_error';
        var kvp = document.location.search.substr(1).split('&');
        kvp.push([encodeURI('error'),encodeURI(errKey)].join('='));
        window.location.search = kvp.join('&');
    }
    
    var aLogout = document.querySelector('#logout');
    var href = aLogout ? aLogout.getAttribute("href") : null;
    if (href) {
        var lp = encodeURIComponent(href);
        var slp = document.createElement('script');
        slp.setAttribute('src', 'https://idp.company.com/blitz/simple/slp?app=app_id&lp=' + lp);
        document.head.appendChild(slp);
    }
    

    Пример настроек протокола Simple для приложения представлен на рисунке ниже.

    ../_images/simple.png
  2. Задать настройки проксирования запросов к приложению на веб-сервере.

    Пример конфигурационного файла для веб-сервера nginx:

    map "" $idp_host {
            default <server hostname>:9000;
    }
    
    map "$http_Blitz_Idp" $idp_post_login {
            default "0";
            "prepare-login" "1";
    }
    
    map "$arg_passive" $activLogout {
            default "1";
            "true" "0";
    }
    
    upstream oc-web {
        server <application server hostname>:<application port>;
    }
    
    server {
        listen 80;
        server_name <application domain name>;
        # enforce https
        return 301 https://$server_name$request_uri;
    }
    
    server {
        listen         443 ssl;
        server_name    <application domain name>;
    
        resolver               172.27.0.20 172.25.0.50 valid=300s;
        #resolver               8.8.8.8 valid=300s;
    
        #ssl_certificate        /etc/nginx/cert/<path to SSL certificate>.pem;
        #ssl_certificate_key    /etc/nginx/cert/<path to SSL certificate key>.pem;
    
        #ssl_certificate /etc/letsencrypt/live/app.company.com/fullchain.pem; # managed by Certbot
        #ssl_certificate_key /etc/letsencrypt/live/app.company.com/privkey.pem; # managed by Certbot
    
        access_log              /var/log/nginx/oc-acs.log full;
        error_log               /var/log/nginx/oc-err.log error;
    
        ### force timeouts if one of backend is died ##
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    
        ### Set headers ####
        proxy_set_header        Accept-Encoding   "";
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        add_header              Front-End-Https   on;
        proxy_redirect          off;
    
        proxy_set_header        Cookie "$http_cookie;domain2auth=$host";
        proxy_hide_header       Content-Security-Policy;
    
        add_header Content-Security-Policy "default-src 'self' https://$idp_host; script-src 'self' https://$idp_host 'unsafe-eval'; img-src 'self' data: https://$idp_host; style-src 'self' 'unsafe-inline'; font-src 'self' data:; frame-src 'self'; connect-src 'self'";
    
        location ~ <path to login page of the application>$ {
                #if ($http_referer ~* "/blitz/simple") {
                #    set $idp_post_login "1";
                #}
                if ($http_referer ~* "<main server domain name>") {
                    set $idp_post_login "1";
                }
                if ($idp_post_login = "1" ) {
                    proxy_pass http://oc-web$request_uri;
                }
                if ($idp_post_login = "0" ) {
                    proxy_pass http://$idp_host/blitz/simple/prepare$request_uri;
                    break;
                }
        }
        location ~ /logout$ {
            if ($activLogout = "1") {
                return 302 https://<main server domain name>/blitz/simple/active_logout?app=$host;
            }
            proxy_pass http://oc-web$request_uri;
        }
        location / {
            proxy_pass http://oc-web;
        }
    }