用 jwt 反应多个子域身份验证

React multiple subdomain auth with jwt

我们希望使用相同的用户数据库和 Rest API 开发一些不同的服务(React Apps)。 一些用户可能可以访问 APP 1,一些用户可以访问 APP 2,一些用户可以访问两者,具体取决于他们的角色。

结构:


授权流程:


此流程中有两个主要问题,标记为 1 和 2:

  1. 假设我转到登录应用程序并登录,从后端获取访问令牌。 我如何将令牌发送到 app1.company.com?应该使用 url 参数中的令牌对登录 APP 重定向做出反应?

    • 本地存储在子域范围内。

    • iframe 在 Safari 中有问题。

    • 我暂时不想将 jwt 保存在 cookie 中,因为 flask REST 可以为非浏览器零售客户端提供服务。


  1. 假设用户想要转到 app2。如果我们无法使用 iframe 或任何其他方法共享来自 app1 的令牌,则应将此应用重定向到登录并再次作为 app1 进行处理,这对我们来说很好。 但真的是这样吗?如果令牌不再无效并且我们从后端收到错误,我们是否应该重定向到另一个子域中的登录应用程序(嵌入 url 我们想在登录成功后返回)?

    • 我可以只使用第 3 方开放 ID 连接服务吗?

    • 我是否应该考虑使用微前端方法将所有 "apps" 放在同一个域中?

    • 举个例子"Attlassian"如何处理这个过程?


我缺少什么以及解决此流程的最佳方法是什么?

Lets say i go to the login app and log in, getting accestoken from the backend. How do i deliver the token to app1.company.com?

login.company.com 在 URL 中将令牌作为参数传递不是问题,因为站点可以通过验证数字签名或使用特定端点来验证令牌的真实性在中央认证域。这就是 openid/oauth2 使用 "implicit" 流程的方式,尽管它们也允许将令牌作为 POST 发送,或者使用两步流程("authorization_code" 流程)

Lets say the user want to go to app2. if we aren't able to share the token from app1 with iframes or any other method, then this app should be redirected to login and make the process again as app1, which is fine for us. But is this really the way?

您可以使用内部 iframe 在域之间共享令牌,但对于您的情况,我建议每个域都使用自己的令牌。

if token is invalid anymore and we get Error from backend, should we redirect to the login app in the other subdomain (embed the url we wanna go back to after login success)?

是的,在您绘图的编号 2) 中,只需从 app2.company.com 重定向到 login.company.com,然后按照与 1) 中相同的流程进行操作。您需要在 login.company.com 上使用某种类型的 cookie,以避免再次向用户请求凭据

Can i just use 3rd party Open id connect service?

是的,您可以使用外部 OpenIdConnect 服务,或在 login.company.com 部署 OpenIdConnect 服务器,如 IdentityServer 或 KeyCloak

Should i consider microfrontends approcah to make the all the "apps" on the same domain?

不需要中央认证域

How "Attlassian" as an example handles this process?

我不太清楚 Attlassian 是如何做到的,但目前大多数网络服务都支持 OpenIdConnect