Обработка неявного перенаправления OAuth2 с угловой маршрутизацией с использованием HashLocationStrategy

Я включаю OAuth2 в SPA следующим образом:

  • Тип неявного предоставления является единственным поддерживаемым типом предоставления
  • Приложение My Angular 5 использует HashLocationStrategy для своей маршрутизации

Я не могу изменить ни одно из этих ограничений.

Когда я захожу в свое приложение и получаю перенаправление, URL перенаправления из конечной точки авторизации выглядит так:

http://foo/#access_token=(ey...)&token_type=bearer&state=(state...)&expires_in=43199&jti=(jti...)

Это, как и ожидалось, согласно спецификации OAuth2; параметры, присутствующие в URL перенаправления, должны быть добавлены как фрагмент (после "#").

У меня проблема в том, что Angular интерпретирует символы, следующие за хешем, в соответствии со своей стратегией определения местоположения хеша. Он пытается перенаправить на путь access_token=... который не существует.

Как мне обойти это?

1 ответ

Решение

Вы должны указать маршрутизатору прекратить его махинации, пока вы не закончите обработку URL. Вот как:

imports: [
  ..
  RouterModule.forRoot(routes, { initialNavigation: false }),
],
...

Теперь любопытный маршрутизатор не будет ничего делать при загрузке страницы. Что означает, что вы должны позаботиться об этом! Проанализируйте состояние OAuth, токены и т. Д. Затем выясните, по какому маршруту вы пытались добраться (например, из redirectUrlкакая-то часть самого фрагмента, что-то из localStorage от, прежде чем отойти для аутентификации или тому подобное. Как только вы это сделали, позвоните маршрутизатору и попросите его возобновить:

this.accessToken = this.url....
this.router.navigate('wherever-you-wanted-to-go-in-the-first-place');
Другие вопросы по тегам