我们刚刚讨论了使用 OAuth 2 时的登录和注销行为。假设我们有两个 web 应用程序A
并B
使用一个 OAuth 提供程序O
(使用 spring-security-oauth2 堆栈构建)。
当您想登录时,A
您会被重定向到O
,输入您的凭据,在那里获得一个会话O
,使用访问令牌重定向回,A
并且还会创建一个会话A
。
现在,当您想要登录时,B
您会被重定向到O
,直接将令牌发送回 B,因为您仍然有一个有效的 sesison,O
并且还会创建一个会话B
(无需再次输入您的凭据)。
这解决了我们的单点登录问题。
现在的一个要求是,当您从两个/所有应用程序注销A
或 B
注销时(单点注销)。
我们的想法是:
- 使用当前会话 id 增强访问令牌
- 如果应用程序
A
或B
想要注销用户,它们会将他重定向到注销页面O
- 如果用户从 注销
O
,则属于当前会话的所有访问令牌O
都将被删除,并且用户将被重定向回A
或B
- 会话开启
A
或被B
破坏 A
并B
在每个请求上检查他们的 OAuth 访问令牌的有效性,如果令牌不再有效,则销毁他们的会话
您认为这是 OAuth 2 的有效用例吗?您将如何以不同的方式实施单点注销?