Authentication 如何处理微服务的授权和身份验证?

Authentication 如何处理微服务的授权和身份验证?,authentication,authorization,microservices,openid-connect,keycloak,Authentication,Authorization,Microservices,Openid Connect,Keycloak,在我的公司,我们正在微服务之上构建一个应用程序。我们正在努力决定如何处理授权和身份验证。我们正在考虑使用OpenId Connect对用户进行身份验证,但在授权方面,我们需要一些建议 让我解释一下解决方案的工作原理:一个用户可以在不同的部门中扮演不同的角色,部门的数量可以超过200个。在每个部门中,用户可以有多个角色。我们知道,处理角色的推荐方法是将它们放在从客户端发送到服务器(JWT)的令牌中。但是,我们担心这会使代币有效载荷过大。据我所知,一个浏览器可以容纳多达5KB的数据头。在我们的例子中

在我的公司,我们正在微服务之上构建一个应用程序。我们正在努力决定如何处理授权和身份验证。我们正在考虑使用OpenId Connect对用户进行身份验证,但在授权方面,我们需要一些建议

让我解释一下解决方案的工作原理:一个用户可以在不同的部门中扮演不同的角色,部门的数量可以超过200个。在每个部门中,用户可以有多个角色。我们知道,处理角色的推荐方法是将它们放在从客户端发送到服务器(JWT)的令牌中。但是,我们担心这会使代币有效载荷过大。据我所知,一个浏览器可以容纳多达5KB的数据头。在我们的例子中,这意味着大约50个部门有两个角色(未压缩)。这样做的好处是,当用户进入微服务时,他/她得到了授权和认证。正如我所提到的,缺点是令牌中的大负载

我们还考虑了另一种选择,将JWT保持在最小值(userid和departmentid),并在每个请求上查询keydape以获得用户权限(可能添加一些寿命较短的缓存机制)。这种方法将向授权服务器生成大量请求

我想要的是关于其他人如何解决这个问题的一些建议/经验。如果需要,我很乐意提供更多信息

为了便于您提供建议,以下是两种选择的简短说明: 1) 使用JWT处理身份验证和授权?为什么? 2) 保持JWT轻松,并在每个微服务中向授权服务器发出请求?为什么?

我想说,有两种选择:

选择1
  • 保持JWT灯亮
  • 将OAuth2“授权码”授权类型与刷新令牌和访问令牌一起使用
  • 使用逐出策略(如LFU)在集中式分布式缓存系统中缓存用户权限
  • 在访问令牌更新期间(根据访问令牌的有效期定期更新),获取用户的最新访问权限并刷新缓存
  • 如果访问权限在缓存中不可用,请查询KeyClope并在缓存中添加条目
  • 因此,

  • 权利的任何变更都将在令牌有效期内得到反映
  • 由于缓存,性能会更好
  • 选择2 与选项1相同,只是您可以在用户权限数据库上使用更改数据捕获(CDC)来保持缓存随访问权限的任何更改而更新