2

我在 SPA 上启用 OAuth2,如下所示:

  • 隐式授权类型是唯一支持的授权类型
  • 我的 Angular 5 应用程序使用 HashLocationStrategy 进行路由

我无法更改这些约束中的任何一个。

当我登录到我的应用程序并被重定向时,来自授权端点的重定向 url 如下所示:

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

这符合 OAuth2 规范的预期;重定向 url 中的参数必须作为片段附加(在“#”之后)。

我遇到的问题是 Angular 正在根据其散列位置策略解释散列之后的字符。它正在尝试重定向到access_token=...不存在的路径。

我该如何解决这个问题?

4

1 回答 1

2

在处理完 URL 之前,您需要告诉路由器停止使用它的恶作剧。就是这样:

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

现在爱管闲事的路由器不会在页面加载时做任何事情。这意味着你必须照顾它!去解析你的 OAuth 状态,令牌等。然后找出你试图到达的路线(例如,从redirectUrl,片段本身的某些部分,localStorage从导航到 auth 之前的一些东西,或类似的东西。一旦你这样做了,呼叫路由器,告诉它恢复:

this.accessToken = this.url....
this.router.navigate('wherever-you-wanted-to-go-in-the-first-place');
于 2018-12-22T00:39:14.610 回答