2016-04-28 4 views
1

Мы пытаемся реализовать простой механизм аутентификации с использованием NGINX в качестве прокси-сервера и auth_request для защиты некоторых статических файлов.Как я могу обрабатывать настройки cookie сеанса, а затем использовать его с NGNX auth_request?

  • статические документы находятся в docs.mydomain.com
  • АНИ генерировать маркер сеанса с электронной почтой/пароль в login.otherdomain.com (Он возвращает JSON с электронная почта и сессионный токен)

текущий процесс аутентификации выглядит так:

  1. Когда пользователи попытаются получить доступ к docs.mydomain.com, им будет представлена ​​форма входа. Там они вводят свои учетные данные, адрес электронной почты/passwd будет отправлен через AJAX, и API предоставит нам токен сеанса, и мы сохраним его в файле cookie, что-то вроде этого (также заметили, что в login.otherdomain.com у меня есть включенная аутентификация).

    $("form").submit(function(event) { 
        $.ajax({ 
        async: false, 
        url: "http://login.otherdomain.com/api/user_sessions", 
        method: "POST", 
        data: { 
          user_sessions: 
          { 
          email: $("#email").val(), 
          password: $("#password").val(), 
          } 
          }, 
        success: function(resp_hash) { 
          $("form").reset() // Clearing form so email/pwd is not sent in POST request 
          document.cookie = "x_api_session_id="+resp_hash.user_sessions.id; 
         } 
        }); 
    }); 
    
  2. Тогда форма фактически направляется (с использованием GET), и вы можете увидеть очищенные поля в запросе (по электронной почте & пароль), который выглядит своего рода некрасиво. Запрос отправляется в docs.mydomain.com/docs, который проверяет токен сеанса на login.otherdomain.com и проверяет, все ли он действителен, и все это с использованием nginx auth_request (https://developers.shopware.com/blog/2015/03/02/sso-with-nginx-authrequest-module/). Что-то вроде этого:

    location /docs { 
        auth_request /auth; 
    } 
    
    location = /auth { 
        internal; 
        proxy_pass $auth_api; 
        proxy_pass_request_body off; 
        proxy_set_header Content-Length ""; 
        proxy_set_header X-Original-URI $request_uri; 
        proxy_set_header X-Api-Session-Id $cookie_x_api_session_id; 
    } 
    

И затем отображаются документы. Нам по-прежнему необходимо выполнить чистую обработку сообщений об ошибках, но это с самого начала. Тем не менее, это кажется уродливым (особенно запрос AJAX для получения токена сеанса), и я думаю, что должен быть лучший способ сделать это. Любые идеи о том, как это можно улучшить? Имеются ли последствия для безопасности на пути, который мы пытаемся реализовать?

ответ

0

У меня были те же требования несколько дней назад для доступа к частным услугам в кластере, и я придумал аналогичное решение. Я реализовал простой authentication server с запросом AJAX на стороне клиента для аутентификации и получения токена сеанса.

С точки зрения безопасности, поскольку запрос проходит через HTTPS, все должно быть в порядке. Однако я был обеспокоен самой слабой системой аутентификации, это была простая операция привязки LDAP ... Я решил настроить двухфакторную аутентификацию с помощью TOTP, и это решило большую часть моих проблем. Это достаточно безопасно для меня, чтобы избежать большинства атак или, по крайней мере, до появления квантовых компьютеров!

Надеюсь, это помогло!