Приложение Angular не может перенаправить после входа в систему OAuth2 при использовании HashLocationStrategy
Я работаю над существующим в производстве приложением Angular 7. Моя задача - перейти от локальной схемы аутентификации к существующему провайдеру идентификации в масштабах компании. Поставщик удостоверений совместим с OAuth2. Я использую библиотеку oidc-client, чтобы попытаться добиться этого.
Приложение Angular использует HashLocationStrategy, и я совершенно уверен, что это требование не может измениться. Я не был первоначальным автором этого приложения, поэтому я не знаю точных причин для выбора HashLocationStrategy вместо PathLocationStrategy по умолчанию. Прямо сейчас я бы предпочел не спускаться по кроличьей норе, переходя на PathLocationStrategy. Я мог бы попросить больше проблем.
Провайдер идентификации не разрешает использование символа решетки в URI перенаправления, как указано в спецификации OAuth 2.0 здесь: https://tools.ietf.org/html/rfc6749 ("URI конечной точки НЕ ДОЛЖЕН включать фрагментный компонент ".
Для разработки я хочу, чтобы URI перенаправления после успешного входа в систему был "http://localhost:8080/", но из-за вышеуказанного ограничения я не могу этого сделать. Разработчики, владеющие API поставщика удостоверений, посоветовали мне закодировать символ решетки в URI перенаправления, например: "http://localhost:8080/%23/dashboard". Я пробовал это, но когда мое приложение обнаруживает перенаправление, оно не декодирует его, поэтому я получаю эту ошибку:
Невозможно GET /%23/dashboard
URL-адрес перенаправления после входа, возвращенный приложению от поставщика удостоверений, выглядит следующим образом:
Моя функция авторизации authservice выглядит так, чтобы вызвать страницу входа:
login() {
const idSettings = {
scope: 'openid',
response_type: 'code',
authority: this.baseUrl,
client_id: this.clientId,
redirect_uri: 'http://localhost:8080/%23/dashboard', // This is what the ID provider will allow.
};
this.userManager = new UserManager(idSettings); // oidc-client UserManager
return this.userManager.signinRedirect();
}
Мой вопрос: есть ли событие, которое я могу прослушать в приложении Angular, чтобы захватить и декодировать URL-адрес перенаправления после входа в систему, прежде чем пытаться направить туда? Если это так, я могу просто преобразовать% 23 в # и продолжить перенаправление.
Или, альтернативно, есть ли способ временно приостановить использование HashLocationStrategy для этого одного маршрута? Если бы это было возможно, я мог бы использовать "http://localhost:8080/dashboard для своего URI перенаправления и все же заставить его перенаправлять на правильный компонент.
Я искал в Интернете, но до сих пор все примеры Angular, которые я видел, используют PathLocationStrategy вместо HashLocationStrategy.
Я также искал здесь и не обнаружил вопроса, в точности похожего на мой. Так что я не думаю, что это повторяющийся вопрос.
Спасибо за любой совет.
ОБНОВИТЬ: Как бы то ни было, мне так и не удалось решить эту проблему, кроме как путем изменения приложения с использования HashLocationStrategy на использование PathLocationStrategy. Вот что я сделал. Я провел еще несколько исследований в области управления исходным кодом и обнаружил, кто и когда было внесено изменение в HashLocationStrategy, и на основании этого я предполагаю, что первоначальный автор не осознавал, что некоторая конфигурация на веб-сервере необходима для поддержки PathLocationStrategy, и это (надеюсь) единственная причина, по которой он решил использовать HashLocationStrategy. Мы используем dev-сервер webpack для наших веб-серверов разработки (localhost), поэтому было относительно просто добавить "historyApiFallback: true" в webpack.config.js, чтобы поддерживать перезагрузку того же URL. Когда я получаю доступ к нашим промежуточным и производственным серверам, использующим nginx,Надеюсь внести аналогичные изменения в конфигурацию.