【问题标题】:OAuth2: Extract access_token fragment from implicit flowOAuth2:从隐式流中提取 access_token 片段
【发布时间】:2017-08-30 11:17:38
【问题描述】:

我不太清楚如何处理 oauth2 隐式流响应。我使用 angular4 创建了一个 SPA。据我所知,我需要创建一个请求,如下所示:

GET /authorize?
  response_type=token&
  client_id=s6BhdRkqt3&
  state=xyz&
  redirect_uri=<<uri-located-into-SPA>>

我不太了解的是如何处理响应。响应是对先前指定的redirect_uri 查询参数的重定向。

HTTP/1.1 302 Found
Location: <<uri-located-into-SPA>>#access_token=2YotnFZFEjr1zCsicMWpAA&
    state=xyz&
    token_type=example&
    expires_in=3600

那么,我应该如何实现&lt;&lt;uri-located-into-SPA&gt;&gt; 以提取access_token,我应该设置哪个?

【问题讨论】:

    标签: angular oauth-2.0


    【解决方案1】:

    重定向 URI(例如 /auth/oauth2)应映射到将当前浏览器 URL 的 parse the hash part 的组件,将 access_token 值保存在某处(sessionStorage、localStorage 或某些 Angular 服务或存储)。如果您想将访问令牌与每个后端请求一起发送,请创建一个 HttpInterceptor(来自新的 Angular HttpClient API)并将其添加到那里。

    如果您想在访问令牌过期之前刷新访问令牌,您还应该设置一个超时功能来刷新访问令牌(使用隐藏的iframeprompt=none URL 参数)。

    组件不需要有任何真实的视图。处理完成后,只需将路由更改为某个现有应用程序组件 - 初始视图或身份验证之前请求的视图。

    【讨论】:

    • 我刚刚创建了一个没有指定模板的组件,我收到了这个错误:No template specified for component DBoxOAuthComponent。是否可以在没有模板的情况下创建组件?
    • 可能你做不到,但你可以创建一个空模板或一个包含简单内容的模板,例如“请稍候...”文本。
    • 我不太清楚如何构建一个 url 来测试我的组件。我的意思是,所有路线都有一个# 符号,例如localhost:3002/#/{login|app...}。我一直不明白为什么会出现这个#。但是,现在我需要将 access_token 片段放入 url 以测试组件。我试过localhost:3002/#/oauth#access_token=234,但它不起作用。有什么想法吗?
    • 是的,重定向 URL 不应包含哈希部分 (#...)。默认情况下,Angular 使用不带哈希的 HTML5 路由,但可以通过 RouterModule.forRoot(routes, { useHash: true }) 配置为使用它。所以试着在你的项目中找到它,如果可能的话,把它改成false。有关详细信息,请参阅angular.io/guide/router#browser-url-styles
    • 我已删除 useHash,现在 Angular 正在应用 PathLocationStrategy calss。我现在面临一个奇怪的路由行为。我的意思是,当我尝试转到localhost:3002\oauth 位置时,位置路径更改为localhost:3002\oauth\loginlogin 是根应用程序路径)。我也试过去localhost:3002\login,但是位置路径更改为localhost:3002\login\login...有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 2016-02-23
    • 2018-10-21
    • 2018-08-30
    • 2018-07-04
    • 2015-12-20
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多