【发布时间】:2022-12-14 10:00:15
【问题描述】:
背景
我正在尝试从现有的单页应用程序为本机移动应用程序实现 browser-based login。它使用WebView 来呈现 SPA,并使用 Keycloak OIDC 作为其身份提供者。
SPA 和 IdP 位于完全不同的域中,身份验证是通过在成功登录后重定向到 SPA 域并从 SPA 服务器之一的 IdP 域检索活动会话(cookie)来完成的。这是通过使用 keycloak 中间件实现的,我相信它是 postAuth
概括:
- 执行登录 -> auth.idp.com
- 重定向 -> best.app.com
- 是登录吗? -> best.app.com/login
- auth.idp.com 会话是否存在?
- 用户已登录,重定向 -> best.app.com
- Token 在 URL 中传递,仅存储在内存中
- Token用于建立WebSocket连接
问题
基于the spec,授权应该在浏览器/应用内浏览器中进行,并且授权码必须通过自定义 URL 方案传递。考虑到这一点,驻留在本机移动应用程序
WebView中的 SPA 将永远不会从 IdP 的域建立会话,因为这将从处于不同进程的浏览器委派,并且显然使用与 @ 不同的 cookie 存储987654329@ 在移动应用程序中,这使得我们现有的解决方案无法解决,因为它依赖于 IdP 的域 cookie。建议的解决方案
我上面描述的问题可以通过减少对 IdP 会话的依赖和管理 SPA 自己的会话来缓解,这基本上意味着持久存储可以从 IdP 获得的令牌(当前解决方案不这样做)。
(我不想详细介绍解决方案,因为我只想首先关注存储令牌的概念。我认为最好单独讨论。)
观点
- 目前的实施似乎并没有真正遵循 OIDC 流程的最佳实践,但不知何故,Keycloak 制作了一些中间件来消除使用这些令牌(授权和访问令牌)的需要
- 在实施 SPA 或非 Web 应用程序时依赖 IdP 的会话似乎不是一种选择,因为无法获取 cookie。
- 重定向到 IdP 的会话不是 SPA 的良好用户体验。在这里看到同样的情绪,但似乎没有任何答案:https://lists.jboss.org/pipermail/keycloak-user/2016-October/007937.html
问题
关于我提出的解决方案,即存储从 IdP 检索到的令牌:
- 是否存在任何安全漏洞或将要引入的非行业标准?如果是这样,那些是什么?
- OIDC 流程是否通常依赖 IdP 的会话(cookie)来检查现有会话?
- 如果#2 的回答是否定的,该解决方案是仅针对 Keycloak 的,还是也适用于其他 IdP?
- 知道我们的目标是 SPA 后,当前的实施是否存在缺陷?
【问题讨论】:
标签: node.js session cookies keycloak single-page-application