我目前正在使用OIDC在多个应用程序上实现SSO。我不确定如何在单页应用程序(SPA)中处理基于令牌的身份验证的单点注销。
考虑两个应用程序。应用程序A是使用OAuth2授权代码流的标准Spring MVC应用程序,而应用程序B是使用隐式流程的SPA。如果用户已登录到应用程序A,当他们导航到应用程序B时,他们会自动通过SSO登录,这是预期的。但是,如果用户退出应用程序A然后导航到应用程序B,则当前应用程序B仍会加载并允许访问api,因为它具有存储在浏览器本地存储中的有效OAuth2访问令牌。我希望应用程序B要求用户在发出任何其他请求之前重新进行身份验证。
在SPA中进行单点注销的推荐方法是什么,因为无法让身份提供者向服务器端点发送“注销”请求?
我想到的几个可能的解决方案是:
我对使用这两种解决方案中的任何一种都犹豫不决,因为只要用户与应用程序交互,它们就需要向IDP提出额外请求。是否有其他策略可以解决这个问题?
修改
感谢sdoxsee的回答,需要进一步澄清。我应该提到,从应用程序A或应用程序B注销也会将用户从IDP会话中记录下来。但是,由于应用程序B在浏览器本地存储中具有有效的访问令牌,当用户导航到应用程序B时,尽管没有活动的IDP会话,但他们仍将“登录”到应用程序B 。希望这提供了一些更多的说明。
答案 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规范中,但实施草案可能比滚动您自己的策略更明智。
可能还有其他实施草案来解决这个问题,所以如果这个问题没有帮助,可以再搜索一下(参考这个),因为可能会与其他选项进行比较。