Как я могу обработать настройки cookie сессии, чтобы затем использовать их с NGINX auth_request?
Мы пытаемся реализовать простой механизм аутентификации, используя NGINX в качестве прокси-сервера и auth_request для защиты некоторых статических файлов.
- Статические документы находятся в docs.mydomain.com
- API для генерации токена сеанса с электронной почтой / паролем находится в login.otherdomain.com (он вернет JSON с токеном электронной почты и сеанса)
Текущий процесс аутентификации выглядит так:
Когда пользователи пытаются получить доступ к 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; } }); });
Затем форма действительно отправляется (с помощью 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, и это решило большую часть моих проблем. Это достаточно безопасно для меня, чтобы избежать большинства атак, или, по крайней мере, до появления квантовых компьютеров!
Надеюсь, это помогло!