SPA中的OIDC会话管理(单点登出)

时间:2018-06-15 23:38:16

标签: oauth-2.0 single-sign-on single-page-application oidc

我目前正在使用OIDC在多个应用程序上实现SSO。我不确定如何在单页应用程序(SPA)中处理基于令牌的身份验证的单点注销。

考虑两个应用程序。应用程序A是使用OAuth2授权代码流的标准Spring MVC应用程序,而应用程序B是使用隐式流程的SPA。如果用户已登录到应用程序A,当他们导航到应用程序B时,他们会自动通过SSO登录,这是预期的。但是,如果用户退出应用程序A然后导航到应用程序B,则当前应用程序B仍会加载并允许访问api,因为它具有存储在浏览器本地存储中的有效OAuth2访问令牌。我希望应用程序B要求用户在发出任何其他请求之前重新进行身份验证。

在SPA中进行单点注销的推荐方法是什么,因为无法让身份提供者向服务器端点发送“注销”请求?

我想到的几个可能的解决方案是:

  1. 创建一次性使用访问令牌,必须为每个请求重新生成。
  2. 在应用程序B想要向我们的apis发出请求时,检查是否有活动的IDP会话。
  3. 我对使用这两种解决方案中的任何一种都犹豫不决,因为只要用户与应用程序交互,它们就需要向IDP提出额外请求。是否有其他策略可以解决这个问题?

    修改

    感谢sdoxsee的回答,需要进一步澄清。我应该提到,从应用程序A或应用程序B注销也会将用户从IDP会话中记录下来。但是,由于应用程序B在浏览器本地存储中具有有效的访问令牌,当用户导航到应用程序B时,尽管没有活动的IDP会话,但他们仍将“登录”到应用程序B 。希望这提供了一些更多的说明。

1 个答案:

答案 0 :(得分:3)

除非您退出IDP,否则即使您结束客户端会话,您也会在客户端应用中自动重新登录。你必须结束IDP(或OP)会话。也就是说,如果没有退出Google地图,YouTube,Google云端硬盘以及退出Google帐户(IDP / OP),就不会退出Gmail。使用oidc退出(我已经看到已实施)的最常见方式是在实施草案中捕获的:http://openid.net/specs/openid-connect-session-1_0.html#RPLogout

请注意。这不是oidc规范本身的一部分,因此OP实现可能没有这个。

根据已修改的问题进行更新:

dhouston,据我所知,你不能简单地注销RP(客户端)和OP(身份提供商),而是所有已登录OP的RP OP的会议。这是比较棘手的,但也有一个草案,建立在我之前提到的那个基础之上。 http://openid.net/specs/openid-connect-frontchannel-1_0.html

警告:我自己没试过。基本思想是OP跟踪通过其会话登录的RP列表,并启动每个RP的注销。同样,这不在OIDC规范中,但实施草案可能比滚动您自己的策略更明智。

可能还有其他实施草案来解决这个问题,所以如果这个问题没有帮助,可以再搜索一下(参考这个),因为可能会与其他选项进行比较。