我们刚刚讨论了使用OAuth时的登录和注销行为2.假设我们有两个使用OAuth提供商A
B
和O
的网络应用程序security-oauth2 stack)。
当您想要登录A
时,您会被重定向到O
,请输入您的凭据,在O
上获得会话,然后重定向回A
令牌和会话也在A
上创建。
现在,当您想要登录B
时,您会被重定向到O
,直接通过令牌发回给B,因为您在O
和会话上仍然有一个有效的sesison也是在B
上创建的(无需再次输入凭据)。
这解决了我们的单点登录问题。
现在的要求是,从A
或 B
退出时,您将始终从两个/所有应用中注销(单点注销)。
我们的想法是:
A
或B
想要注销用户,他们会将用户重定向到O
O
退出,则O
上属于当前会话的所有访问令牌都将被删除,用户将被重定向回A
或B
A
或B
上的会话被销毁A
和B
检查每个请求上OAuth访问令牌的有效性,如果令牌无效,则销毁其会话您认为这是OAuth 2的有效用例吗?您如何以不同方式实施单点注销?
答案 0 :(得分:7)
这个问题没有明确答案的原因是,这完全取决于您对用户体验的偏好,以及您信任和/或控制应用程序和服务器的程度。
我认为有几种方法可以做到,你的建议绝对可行。我会批评它只是因为a)你使用OAuth令牌作为会话令牌,并且它们实际上不是一回事,并且b)“检查每个请求上的OAuth访问令牌的有效性”部分是有点模糊,我怀疑用户体验可能会受到影响。
一般情况下,从OAuth2客户端应用程序系统进行单点注销并不总是可取的 - 用户可能认为他们已登录到单独的系统中,这些系统碰巧为他们方便地进行身份验证,而实际上并不需要单个系统签署经验(例如,如果我退出一个Facebook用户提供的应用程序,我不希望退出我的时间线)。
如果你做需要单一注销并且你的所有应用都在同一个域中,你可以让它们共享一个范围限定在他们共享的域中的会话cookie。如果其他应用程序共享同一个域并且可能不想参与单点登录/关闭行为,或者您可能不信任它们以使cookie保密,则这很危险。
使用Spring Session,您可以更复杂,只在您信任的应用程序之间共享会话令牌(因为您只提供对会话存储的访问权限)。这可能会非常有效,如果我控制了所有移动的部件,我可能会在你的位置上这样做。
查看OpenID Connect Session Management Spec以查看是否有任何想法可能会有所帮助。绝对存在身份令牌的概念(与访问令牌不同)。我认为他们建议在浏览器中使用iframe中的脚本进行验证检查,这看起来非常难看,但也许真的没有更好的方法。如果您喜欢这个想法,那么您可以使用正常的会话cookie做同样的事情(可能不需要完整的OIDC)。