跨域会话

问题描述 投票:0回答:1

我所在公司的项目正在更改,名称为App A、App B、App C和App D。其中之一就是登录和会话。

两个应用程序(A 和 B)具有相同的数据库,这意味着用户对两个应用程序都拥有一个登录名/密码。这些应用程序通常是并行使用的。

我有一个用于登录的 API,它返回一个 jwt,但一次允许一个活动令牌。

然后我被要求让登录流程适用于应用程序 A 和 B,使用相同的 JWT 来维护单个会话。

我遇到的一个问题是项目不一定在同一个域中。

问题是:

  1. 完成这项工作的正确方法是什么?遵循良好的安全实践。
  2. 令牌可以存储在哪里?两个应用程序都可以访问(这可能吗?)。

实际流程:

  • 用户在表单中输入凭据。
  • 向后端API请求。
  • 请求登录API。
  • 使用只读会话信息进行响应(daysToExpirePass、ttl、名称、登录名、tokenCreatedDate、电子邮件和令牌)。
  • 每个请求中仅将令牌(签名)发送到后端 API 以检查权限,其他信息仅用于警告等其他内容,所有逻辑都在后端。
  • 此信息存储在会话存储中。

技术:

  • ExtJS 7.6.0 - 前端
  • Grails 5.2.2 和 Java 11 - 后端
  • 身份验证的内部逻辑。

JWT 负载结构示例:

{
  "sub": "<user>",
  "RANDOM_VALUE": "<uuid>",
  "jti": "<uuid>"
}
javascript java authentication grails extjs
1个回答
0
投票

要跨使用不同域的多个应用程序(App A 和 App B)实现共享会话和 JWT 身份验证,您需要考虑以下方面:

单点登录 (SSO):实施单点登录解决方案,允许用户登录一次并访问多个应用程序,而无需重新输入凭据。这通常涉及使用集中式身份验证服务器。

跨域身份验证:由于应用程序位于不同的域,因此需要解决跨源资源共享(CORS)问题。确保身份验证服务器和应用程序配置为正确处理 CORS。

这是实现此目的的高级方法:

认证服务器:

创建一个单独的身份验证服务器(或使用现有的身份验证服务器)来处理用户身份验证和 JWT 令牌颁发。 配置此服务器以使用共享密钥和通用签名密钥颁发 JWT 令牌。 登录流程:

用户登录App A或App B。 App A 或 App B 的前端向身份验证服务器发送请求以对用户进行身份验证并获取 JWT 令牌。 身份验证服务器验证用户的凭据,创建 JWT 令牌,并将其返回到应用程序 A 或应用程序 B 的前端。 将 JWT 令牌存储在安全的仅 HTTP cookie 中,或使用本地存储等安全存储机制。 跨域认证:

确保认证服务器上的CORS设置允许来自App A和App B域的请求。 您可能需要实现 JSONP 或跨源资源共享 (CORS) 等机制来促进不同域之间的通信。 代币共享:

只要应用程序 A 和应用程序 B 具有相同的签名密钥,JWT 令牌就可以在它们之间共享。这意味着他们可以独立验证令牌,而无需向身份验证服务器发出额外的请求。 每当应用程序 A 或应用程序 B 需要代表用户执行操作时,他们都可以检查 JWT 令牌以获取权限和身份验证。这是验证用户身份的无状态方式。 单点注销:

如果您希望用户在注销其中一个应用程序时从两个应用程序中注销,请实现单点注销机制。这通常涉及通知身份验证服务器使用户会话无效。 JWT 有效负载:

您的 JWT 有效负载应包含用户特定的信息以及身份验证和授权所需的声明。 请谨慎对待 JWT 中存储的声明,因为它们在客户端是可读的。 安全考虑:

确保您遵循安全最佳实践,例如使用安全 cookie、实施正确的令牌验证以及保护 JWT 签名密钥。 定期轮换 JWT 签名密钥以增强安全性。 记录和监控:

实施全面的日志记录和监控,以跟踪身份验证和授权事件并检测任何可疑活动。 用户体验:

确保用户体验流畅,并对登录和会话管理进行适当的错误处理。 请记住,跨不同域实现共享会话和身份验证可能很复杂,并且需要对身份验证和安全实践有深入的了解。此外,在跨多个应用程序处理用户数据时,必须考虑监管和合规性要求,例如 GDPR。

© www.soinside.com 2019 - 2024. All rights reserved.