Как я могу обработать настройки cookie сессии, чтобы затем использовать их с NGINX auth_request?

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

  • Статические документы находятся в docs.mydomain.com
  • API для генерации токена сеанса с электронной почтой / паролем находится в login.otherdomain.com (он вернет JSON с токеном электронной почты и сеанса)

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

  1. Когда пользователи пытаются получить доступ к docs.mydomain.com, им будет предоставлена ​​форма для входа. Там они вводят свои учетные данные, электронная почта / пароль будет затем отправлена ​​через 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-запрос на получение маркера сеанса), и я думаю, что должен быть лучший способ сделать это. Есть идеи, как это можно улучшить? Есть ли последствия для безопасности в том, как мы пытаемся это реализовать?

1 ответ

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

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

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

Другие вопросы по тегам