authentication - SSO 与 JWT 和多个用户帐户 + SPA
问题描述
我有两个 Web 应用程序,它们是一个SPA app.domain1.com
,其中有他自己的 APIapi.domain1.com
和 app.domain2.com
目标是简化从一个应用程序到另一个应用程序的切换,而无需用户通过重新输入密码来登录每个应用程序。我只是一个应用程序的所有者,所以不可能将它们放在反向代理之后。
例子 :
app.domain2.com
重定向到app.domain1.com/connect/{JWT}
-> app.domain1.com
SPA 提取 JWT 并通过 ajax 将其发送到api.domain1.com
验证和登录。
我一直在为这些寻找 OAuth2 和 OpenID Connect,但 OAuth2 更多的是关于资源访问的委派而不是身份验证,并且 OpenID Connect 需要一个身份提供者,这似乎与我的用例不兼容,其中每个应用程序都有自己的身份验证机制并且我无法添加中央认证服务器。理想情况下,我想遵守标准协议。
我以为我可以在每个应用程序上公开一个端点 GET /connect/{JWT} 。JWT 可以包含一个可以识别用户帐户的电子邮件,app.domain1.com 和 app.domain2.com 可以共享用于验证 JWT 未被篡改且有效期较短的密钥。
此端点验证 JWT,验证用户是否匹配 JWT 中的电子邮件并登录用户。
我不确定这些过程的安全注意事项,是否还有其他选择?
谢谢你的帮助。
解决方案
在我看来,您应该选择 OIDC。该协议专为您在此处描述的功能而设计。您可以让其中一个应用程序充当 IdP,而另一个应用程序将成为依赖方。这取决于您为应用程序使用的技术,但在某些语言中,有一些库可以将您的应用程序变成 IdP。
您可以考虑一些通用协议来使联合登录工作,但最好使用标准。这样您就不必怀疑您的解决方案的安全含义是什么 - 您在规范本身中描述了 OIDC 的安全注意事项。
推荐阅读
- android - 原生 Admob 横幅,可以不用打开按钮吗?
- javascript - 无法将文档和集合添加到 Cloud Firestore 以触发翻译文本扩展
- c - 将表声明为结构中的双 *表时出现分段错误
- websocket - 托管网络游戏无需转发端口?
- javascript - form.isFieldsTouched() 改变时如何渲染元素
- windows - 有什么方法可以在 Windows 10 下登录哪些进程访问 GPU?
- python - 如何使用函数的最后一个返回值作为循环中同一函数的输入。Python
- python - 该脚本不通过 crontab 运行
- ldap - 来自命令行的 Nexus 容器中的 LDAP 配置
- java - 我无法在帧中拖放