Authentication 如何在基于JWT的单点登录认证体系结构中实现注销?

Authentication 如何在基于JWT的单点登录认证体系结构中实现注销?,authentication,single-sign-on,jwt,openid-connect,Authentication,Single Sign On,Jwt,Openid Connect,我试图理解如何使用Json Web令牌在单点登录体系结构中实现注销功能 假设我们有: example1.com example2.com authserver.com 当用户必须在example1.com上进行身份验证时,他将被重定向到authserver.com,这将验证用户凭据,创建签名JWT令牌,并使用此令牌将用户重定向回example1.comexample1.com然后将设置cookie(或本地存储密钥),只要令牌未过期,用户将在example1.com上进行身份验证。不需要再调用

我试图理解如何使用Json Web令牌在单点登录体系结构中实现注销功能

假设我们有:

  • example1.com
  • example2.com
  • authserver.com
当用户必须在
example1.com
上进行身份验证时,他将被重定向到
authserver.com
,这将验证用户凭据,创建签名JWT令牌,并使用此令牌将用户重定向回
example1.com
example1.com
然后将设置cookie(或本地存储密钥),只要令牌未过期,用户将在
example1.com
上进行身份验证。不需要再调用
authserver.com
来识别用户

然后,用户转到参与SSO体系结构的
example2.com
。用户也需要在那里进行身份验证,因此
example2.com
还会将用户重定向到
authserver.com
,该站点会识别用户(使用首次设置的cookie),创建新的JWT令牌并自动将用户重定向回
example2.com
example2.com
然后将设置cookie(或本地存储密钥),只要令牌未过期,用户将在
example2.com
上进行身份验证。不需要再调用
authserver.com
来识别用户

现在,如何实现“注销”功能

如果用户在
example1.com
上注销,则
example1.com
上的JWT令牌将被删除,用户不应再在那里进行身份验证。但一旦他试图到达受保护区域,
example1.com
会将他重定向到
authserver.com
,用户将被识别并自动再次登录。。。即使他刚刚注销

问题1)所以我猜当用户注销
example1.com
时,必须调用
authserver.com
删除
authserver.com
设置的cookie,这样用户就不会再自动登录了

问题2)如果是,那么
example2.com
呢?用户是否仍应在那里进行身份验证?如果不是,建议的流程是什么,以便
example2.com
知道它为用户提供的JWT令牌不再有效?

1)是一个用于注销authserver的规范(对于不同的策略还有其他规范)。它定义了example1.com将重定向到的
end\u session\u endpoint
;请注意,authserver将用户注销,并可以重定向回RP的
post\u logout\u redirect\u uri


2) 我认为这取决于你想要它做什么。您可能不想终止example2.com会话,在这种情况下example2.com将继续。JWT对于example2.com仍然有效。如果你想注销你所有的客户,这有点复杂,但也有可能。在我的项目中,我们希望注销一个客户端和authserver。

或者,您也可以在不使用openid的情况下实现跨域SSO,只在客户端使用JWT,如google web apps

优点是不需要将用户重定向到服务器就可以知道用户是否已登录。注销和JWT更改可以在选项卡之间自动同步

Authserver.com将JWT返回给example1后,将其存储在localStorage中,但通过iframe使用中间域sso.example.com。在示例1和示例2中包括这个iframe(指向sso.example.com)。iframe将读取JWT并向包含令牌的页面发送消息

当用户注销或更改活动用户时,iframe还可以向家长发送消息,以便您可以同步所有站点(如果需要)

CORS没有问题,因为sso.example.com可以访问其本地存储。如果识别出起点和终点,则允许iFrame之间进行通信(请参阅)

为了简化开发,我们最近发布了一个跨域SSO,JWT位于

将您的问题总结为此架构 1) 清除localStorage中的JWT并发送javascript事件
2) 聆听活动并决定做什么

非常有趣,谢谢!但我不确定用户注销时为什么要重定向到OP。。。我想不出有什么真实的案例发生在我身上。当我点击“注销”链接时,我想直接注销,而不是重定向到另一个站点以确认操作!此外,即使用户被重定向到OP并确认他想要注销,他仍可能在另一个站点上通过身份验证,例如,
example2.com
。在我看来,结果有点奇怪。如果
example2.com
知道它的令牌不再有效,那么这个流程是有意义的。我想知道后端服务器
example1.com
是否可能有问题,通过传递JWT令牌来清除OP上的会话,自己调用
end\u session\u endpoint
。。。因此,不需要将用户重定向到那里。我遗漏了什么重要的东西吗?在一个OP实现中,IdentityServer3()重定向只会在您同时提供JTW和注销后重定向uri的情况下立即将您重定向回客户端。如果一切正常,您甚至都看不到OP。还有其他规范可以做类似的事情(事实上,IdentityServer3昨天刚刚实现了另一个:)但诀窍是,OP上的浏览器cookie需要清除…我想不出如果不在OP上,你会怎么做)我猜对OP的后端调用可能会使与用户cookie关联的“会话”无效,因此此cookie在不被删除的情况下不再有效。但我同意,如果它是一个快速重定向/重定向回,它是好的。我问是因为