extjs 跨域会话

t2a7ltrp  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(166)

我工作的公司的项目正在改变,名称是App A,App B,App C和App D。其中一个变化是登录和会话。
两个应用程序(A和B)具有相同的数据库,这意味着用户对两者都有一个登录/通行证。通常这些应用程序是并行使用的。
我有一个用于登录的API,它返回一个jwt,但是一次允许一个活动令牌。
然后我被要求为应用程序A和B创建登录流程,使用相同的JWT来维护单个会话。
我遇到的一个问题是,这些项目不一定在同一个领域。
这些问题是:
1.什么是正确的方法来实现这一工作?遵循良好的安全实践。
1.令牌可以存储在哪里?可以被两个应用程序访问(这可能吗?)。
实际流量:

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

技术:

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

JWT payload结构示例:

  1. {
  2. "sub": "<user>",
  3. "RANDOM_VALUE": "<uuid>",
  4. "jti": "<uuid>"
  5. }

字符串

uplii1fm

uplii1fm1#

要在使用不同域的多个应用程序(应用程序A和应用程序B)之间实现共享会话和JWT身份验证,您需要考虑以下方面:
单点登录(SSO):实施单点登录解决方案,允许用户登录一次并访问多个应用程序,而无需重新输入其凭据。这通常涉及使用集中式身份验证服务器。
跨域身份验证:由于应用程序位于不同的域上,您需要解决跨域资源共享(CORS)问题。请确保身份验证服务器和应用程序已配置为正确处理CORS。
这里有一个实现这一目标的高级方法:
验证服务器:
创建一个单独的身份验证服务器(或使用现有的服务器)来处理用户身份验证和JWT令牌颁发。配置此服务器以颁发具有共享密钥和公共签名密钥的JWT令牌。登录流程:
用户登录App A或App B,App A或App B的前端向认证服务器发送请求,对用户进行认证并获取JWT token,认证服务器验证用户的凭证,创建JWT token,并将其返回到应用程序A或应用程序B的前端。将JWT令牌存储在安全的仅HTTP cookie中,或使用安全存储机制(如本地存储)。域身份验证:
请确保验证服务器上的CORS设置允许来自App A和App B域的请求。您可能需要实现JSONP或跨域资源共享(CORS)等机制,以促进不同域之间的通信。令牌共享:
只要App A和App B具有相同的签名密钥,它们就可以共享JWT令牌。这意味着它们可以独立验证令牌,而无需向身份验证服务器发出额外的请求。每当App A或App B需要代表用户执行操作时,它们都可以检查JWT令牌的权限和身份验证。这是一种无状态的方式来验证用户的身份。单次注销:
如果你想让用户在退出一个应用程序时同时退出两个应用程序,那么可以实现单次退出机制。这通常涉及到通知认证服务器使用户的会话无效。JWT Payload:
您的JWT有效负载应包含用户特定的信息沿着,以及身份验证和授权所需的声明。请小心存储在JWT中的声明,因为它们在客户端上是可读的。安全注意事项:
确保您遵循安全最佳实践,例如使用安全Cookie、实施正确的令牌验证以及保护JWT签名密钥。定期轮换JWT签名密钥以增强安全性。日志记录和监控:
实施全面的日志记录和监控,以跟踪身份验证和授权事件,并检测任何可疑活动。
确保用户体验顺畅,并为登录和会话管理提供适当的错误处理。请记住,跨不同域实施共享会话和身份验证可能非常复杂,需要对身份验证和安全实践有深入的了解。此外,在跨多个应用程序处理用户数据时,必须考虑监管和合规性要求,例如GDPR。

展开查看全部

相关问题