使用OAuth 2进行单点注销

时间:2014-11-03 16:13:06

标签: oauth oauth-2.0 logout spring-security-oauth2

我们刚刚讨论了使用OAuth时的登录和注销行为2.假设我们有两个使用OAuth提供商A BO的网络应用程序security-oauth2 stack)。

当您想要登录A时,您会被重定向到O,请输入您的凭据,在O上获得会话,然后重定向回A令牌和会话也在A上创建。

现在,当您想要登录B时,您会被重定向到O,直接通过令牌发回给B,因为您在O和会话上仍然有一个有效的sesison也是在B上创建的(无需再次输入凭据)。

这解决了我们的单点登录问题。

现在的要求是,从A B退出时,您将始终从两个/所有应用中注销(单点注销)。

我们的想法是:

  • 使用当前会话ID
  • 增强访问令牌
  • 如果应用AB想要注销用户,他们会将用户重定向到O
  • 的注销页面
  • 如果用户从O退出,则O上属于当前会话的所有访问令牌都将被删除,用户将被重定向回AB
  • AB上的会话被销毁
  • AB检查每个请求上OAuth访问令牌的有效性,如果令牌无效,则销毁其会话

您认为这是OAuth 2的有效用例吗?您如何以不同方式实施单点注销?

1 个答案:

答案 0 :(得分:7)

这个问题没有明确答案的原因是,这完全取决于您对用户体验的偏好,以及您信任和/或控制应用程序和服务器的程度。

我认为有几种方法可以做到,你的建议绝对可行。我会批评它只是因为a)你使用OAuth令牌作为会话令牌,并且它们实际上不是一回事,并且b)“检查每个请求上的OAuth访问令牌的有效性”部分是有点模糊,我怀疑用户体验可能会受到影响。

一般情况下,从OAuth2客户端应用程序系统进行单点注销并不总是可取的 - 用户可能认为他们已登录到单独的系统中,这些系统碰巧为他们方便地进行身份验证,而实际上并不需要单个系统签署经验(例如,如果我退出一个Facebook用户提供的应用程序,我不希望退出我的时间线)。

如果你需要单一注销并且你的所有应用都在同一个域中,你可以让它们共享一个范围限定在他们共享的域中的会话cookie。如果其他应用程序共享同一个域并且可能不想参与单点登录/关闭行为,或者您可能不信任它们以使cookie保密,则这很危险。

使用Spring Session,您可以更复杂,只在您信任的应用程序之间共享会话令牌(因为您只提供对会话存储的访问权限)。这可能会非常有效,如果我控制了所有移动的部件,我可能会在你的位置上这样做。

查看OpenID Connect Session Management Spec以查看是否有任何想法可能会有所帮助。绝对存在身份令牌的概念(与访问令牌不同)。我认为他们建议在浏览器中使用iframe中的脚本进行验证检查,这看起来非常难看,但也许真的没有更好的方法。如果您喜欢这个想法,那么您可以使用正常的会话cookie做同样的事情(可能不需要完整的OIDC)。