使用 jwt 响应多个子域身份验证

Ami*_*aus 5 authentication subdomain jwt reactjs

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

  • 我们决定采用多个子域应用程序方法。

  • 我们希望 SSO 只用一个页面/应用程序来验证所有应用程序,而不是每个应用程序的本地登录组件。在我们的后端使用 JWT 机制。

结构:

在此输入图像描述


授权流程:

在此输入图像描述


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

  1. 假设我进入登录应用程序并登录,从后端获取 accestoken。如何将令牌传送到 app1.company.com?应该使用 url 参数中的 token 来反应登录 APP 重定向吗?

    • 本地存储是子域范围的。

    • iframe 在 Safari 中存在问题。

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


  1. 假设用户想要转到 app2。如果我们无法与 iframe 或任何其他方法共享 app1 的令牌,那么该应用程序应该重定向到登录并再次以 app1 的方式进行该过程,这对我们来说很好。但这真的是这样吗?如果令牌不再有效并且我们从后端收到错误,我们是否应该重定向到其他子域中的登录应用程序(嵌入我们想要在登录成功后返回的网址)?

    • 我可以只使用第 3 方 Open id 连接服务吗?

    • 我是否应该考虑微前端应用程序来使所有“应用程序”位于同一域上?

    • 以“Attlassian”为例,如何处理这个过程?


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

ped*_*ofb 2

\n

假设我进入登录应用程序并登录,从后端获取 accestoken。如何将令牌传送到 app1.company.com?

\n
\n\n

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

\n\n
\n

假设用户想要转到 app2。如果我们无法与 iframe 或任何其他方法共享 app1 的令牌,则应将该应用程序重定向到登录并以 app1 的身份再次进行该过程,这对我们来说很好。但这真的是这样吗?

\n
\n\n

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

\n\n
\n

如果令牌不再有效并且我们从后端收到错误,我们是否应该重定向到其他子域中的登录应用程序(嵌入我们想要在登录成功后返回的网址)?

\n
\n\n

是的,在绘图的第 2) 处,只需从 app2.company.com 重定向到 login.company.com 并遵循与 1) 中相同的流程即可。\xc2\xa0您将需要在 login.company 上使用某种类型的 cookie。 com 以避免再次向用户请求凭据

\n\n
\n

我可以只使用第 3 方 Open id 连接服务吗?

\n
\n\n

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

\n\n
\n

我是否应该考虑微前端应用程序来使所有“应用程序”位于同一域上?

\n
\n\n

没有必要拥有中央身份验证域

\n\n
\n

以“Attlassian”为例,如何处理这个过程?

\n
\n\n

我不知道 Attlassian 到底是如何做到的,但目前大多数 Web 服务都支持 OpenIdConnect

\n