知识卡片

登出需要向身份提供者传播

专业/工作 · 526.a.2

内容

应用里的”登出”默认只清掉这个应用自己持有的会话数据和令牌,但用户在身份提供者(比如 Keycloak)那边其实还有一个独立的活跃会话——认证时是应用把用户导向身份提供者完成登录的,登出时如果只在应用这一侧清session,用户在身份提供者那边依然保持已登录状态,下次任何应用发起认证请求,身份提供者会直接免密登录放行,用户会诧异”我明明退出了怎么没让我重新登录”。解法是遵循 OIDC 定义的”RP-发起的登出”规范,把登出请求也传播给身份提供者,让应用侧登出和身份提供者侧登出同步发生。发散:这个问题的根源和分布式系统里”状态存在多个地方就必须显式同步”是同一类——认证这件事天生涉及应用和身份提供者两处状态(一处是会话,一处是令牌颁发记录),任何只处理其中一处而假装另一处不存在的设计,都会在用户体验上留下一个说不清楚的诡异行为。

参考来源

《Cloud Native Spring in Action》第11章《Security: Authentication and SPA》