我所在公司的项目正在更改,名称为App A、App B、App C和App D。其中之一就是登录和会话。
两个应用程序(A 和 B)具有相同的数据库,这意味着用户对两个应用程序都拥有一个登录名/密码。这些应用程序通常是并行使用的。
我有一个用于登录的 API,它返回一个 jwt,但一次允许一个活动令牌。
然后我被要求让登录流程适用于应用程序 A 和 B,使用相同的 JWT 来维护单个会话。
我遇到的一个问题是项目不一定在同一个域中。
问题是:
实际流程:
技术:
JWT 负载结构示例:
{
"sub": "<user>",
"RANDOM_VALUE": "<uuid>",
"jti": "<uuid>"
}
要跨使用不同域的多个应用程序(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。