【问题标题】:OpenId Connect Implicit flow, how to maintain sessionOpenId Connect 隐式流,如何维护会话
【发布时间】:2018-06-26 07:32:56
【问题描述】:

我正在构建一个 Angular SPA 应用程序并使用 Okta 作为 Idp。因为它是一个 SPA,所以我认为我需要使用隐式流。我这里有两个问题-

  1. 由于在隐式流程中没有发出刷新令牌,是否意味着用户在令牌过期后将退出应用程序,他必须重新登录?

  2. 为什么在 SPA 的情况下需要使用隐式流?为什么不授权代码流?因为我可以控制前端(SPA)和后端(REST API)。例如,在 Web 应用程序的 Spring MVC 架构的情况下,授权代码流是可能的。

谢谢, pchh

【问题讨论】:

    标签: oauth-2.0 single-sign-on openid-connect okta okta-api


    【解决方案1】:
    1. 是的,如果令牌过期,您必须重新进行身份验证。通常,您在身份提供者站点上仍有一个有效会话,因此您可以使用 iframe 进行“静默”登录。像oidc-client 这样的库支持silent login,它可以为你做到这一点。

    2. 当您需要从您的 javascript 应用程序访问访问令牌时,您需要使用隐式(或混合)流。使用授权代码流,您的 javascript 应用程序无法获取访问令牌,因此如果您的 API 需要访问令牌进行授权,您将发送什么?

    【讨论】:

    • 谢谢@mode777。 1.所以如果用户处于活动状态,那么令牌也会过期吗?即假设令牌的生命周期是 10 分钟并且用户在所有 10 分钟内都处于活动状态,他必须在 10 分钟之前重新进行身份验证是不是很奇怪,这意味着库必须在之前跟踪并获取新令牌10 分钟 2. 我不能从 javascript 进行 HTTP 调用并解析标头并获取授权令牌
    • OAuth 2.0 Bearer Token 规范说最长 60 分钟的生命周期是可以的 (section. 5.3)。但是,是的,最终您的令牌将过期。正如@Ján Halaša 和我所描述的,一旦会话到期,如果您仍然拥有 SSO 会话,您可以在后台静默获取令牌。我将尝试使用oidc-client 添加一个示例
    • @mode777 续订是否依赖 cookie?如果是这样,如果续订 iframe 中使用的 idp 站点托管在另一个域上并且浏览器已禁用“第三方 Cookie”,则可能无法正常工作
    • @akn 我认为第三方 Cookie 不会成为问题。是的,此处涉及 Cookie,但仅涉及第一方 Cookie。静默续订依赖于 SSO 提供商登录页面的 iframe。如果在 iframe 的上下文中,用户仍然拥有一个有效会话的 cookie,则可能会发生静默更新。因此,您的客户端应用程序中没有存储 cookie,而仅存储在 SSO 提供程序中。
    【解决方案2】:
    1. 如果您的身份验证服务器支持 OpenID Connect(OAuth2 扩展)和单点登录 (SSO) 功能,要在旧令牌过期之前获取新令牌,请使用带有您用于身份验证的 URL 的 iframe , 但添加 prompt=none 参数(可能还有 id_token_hint 参数)。见OpenId Connect RFCprompt=none 参数告诉/auth 端点如果用户在您的 OAuth2 服务器上有一个开放的 SSO 会话,则发出一个新令牌。否则,请求将失败。 session management 有一个单独的 RFC。

    2. 授权代码流程要求您访问/token 端点,这通常需要身份验证(客户端 ID + 客户端密码),并且您无法在浏览器中保存密码安全。因此,令牌端点不用于支持 CORS 标头,因此您无法使用 XHR 访问它。使用 Auth 代码流,您将获得一个作为重定向 URL 参数 (?code=) 的代码,该代码将到达托管您的 SPA 的服务器(浏览器在重定向后将其发送到那里)。隐式流程在重定向 URL (#access_token=) 的哈希部分返回令牌,该令牌保留在浏览器中(不会发送到服务器),因此更安全。

    【讨论】:

    • 我不会说如果访问令牌保留在浏览器中会更安全。某些流程的目的实际上是防止将令牌传递给浏览器。但是,单页应用的情况下,往往没有客户端的服务端,所以需要在浏览器中管理令牌。
    • 谢谢@Ján Halaša。所以为了支持授权代码流,javascript不能向授权端点发出http请求并获取重定向url并解析和获取代码并将其发送到SPA,然后SPA像往常一样访问/token端点
    • 我不确定我是否理解您的问题。如果您想要一个后端来交换令牌代码并将令牌发送到您的 SPA,是的,您可以这样做,但我认为隐式流程是为您创建不需要做这些事情的。
    • 哦,好的。有错字,我在下面更正了。
    • 所以为了支持授权代码流,SPA 上的 javascript 不能向授权端点发出 http 请求并获取重定向 url 并解析和获取代码并将其发送给服务提供者或后端,然后发送给服务提供者或 BackEnd 像往常一样访问 /token 端点
    猜你喜欢
    • 2019-12-26
    • 2018-04-05
    • 2016-11-19
    • 2017-03-30
    • 2017-06-28
    • 1970-01-01
    • 2015-06-09
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多