Angular 2+ в сочетании с HTTP 302 перенаправить OAuth или SAML аутентификацию - PullRequest
0 голосов
/ 17 октября 2019

Настройка выглядит следующим образом. Серверная часть Python (REST API), прокси-сервер Apache для обеспечения грубого контроля доступа перед API REST, также выступающий в качестве SAML SP, SAML IDP и Angular front-end.

Открывается пользовательвеб-страница, которая обращается к прокси-серверу Apache перед Python Back-end и сервером Angular. Этот прокси-сервер не видит сеансовый файл cookie и перенаправляет пользователя в IDL SAML, используя код ответа HTTP 302. Пользователь аутентифицируется и перенаправляется обратно в приложение Angular, включая токен SAML. Apache (Mellon) выдает cookie-файл сеанса, если токен SAML действителен.

Во все запросы к API этот cookie-файл сеанса включается, и пользователь проходит проверку подлинности. Этот сеанс истекает через некоторое время. Так как Angular - это SPA (одностраничное приложение), нормального HTTP GET или POST не выдается, поэтому перенаправление 302 не отображается для пользователя. Есть только XMLHTTPRequest для API. Поэтому, когда сеанс истекает, браузер получает HTTP 302, который перенаправляет в IDP. Браузер выполняет перенаправление, извлекает HTML-страницу IDP и представляет ее как ответ на Angular. Angular пытается получить доступ к ответу от IDP, что приводит к нарушению CORS (совместного использования ресурсов между источниками)

Во-первых, существует проблема с CORS, Angular не может прочитать ответ HTML из API. Я действительно не хочу решать проблему CORS. Я хотел бы, чтобы приложение Angular знало, что сеанс истек (потому что он получает HTTP 302), а затем просто перезагружает приложение. Эта перезагрузка является обычным HTTP GET, который получит тот же HTTP 302. В этом случае будет следовать 302, и пользователю будет представлена ​​форма входа в систему IDP.

Как только пользователь аутентифицируется, онперенаправлен обратно в приложение Angular и может продолжить. Существует небольшой недостаток, заключающийся в том, что некоторые данные, введенные в формы, теряются, но это то, чем мы готовы пожертвовать на данный момент.

Согласно следующей проблеме , это может работать сHTTP-перехватчик в некоторых браузерах, но в других - нет, так как браузер работает с 302, а HTTP-перехватчик никогда не увидит этот первый ответ. Когда Angular пытается получить доступ ко второму ответу (ответ от IDP), он попытается получить к нему доступ и нарушить CORS. IDP не установил заголовки CORS, позволяющие домену, который обслуживает наше приложение, получать доступ к ответам.

Некоторые говорят, что лучше изменить 302 на 401, который достигнет перехватчика HTTP. Но тогда нам нужно провести различие между обычными запросами HTTP GET / POST и запросами XMLHTTP. Отвечая 302 одному из них и 401 другому.

Мне кажется, что есть много приложений Angular с REST API, которые используют SAML или OAuth IDP, на которые они перенаправляют через HTTP 302. Но я ненашел решение.

Теперь сеанс истекает, и 302 приводит к нарушению CORS, что приводит к ошибке в консоли браузера. Пользователь не видит этого поведения, и приложение кажется не отвечающим.

Извините, код отсутствует;)

...