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