Приложение 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-адрес перенаправления после входа, возвращенный приложению от поставщика удостоверений, выглядит следующим образом:

http: // localhost:8080/%23 / приборная панель? code =7d25a8af920d219631a15019fc243ca2& state =9821f4153a1b45d3b6ed9a6813bd70c9&session_state=5c59c99f31156aa805b7267f2f82b3d03b08b08e08e08e08e08e08ec8e08ec8e08ec8e08e08e08ec8e0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Моя функция авторизации 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,Надеюсь внести аналогичные изменения в конфигурацию.

0 ответов

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