您如何处理微服务的授权和认证?

时间:2019-03-21 12:19:05

标签: authentication authorization microservices openid-connect keycloak

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

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

我们还在寻找另一种选择,即将JWT保持在最低水平(用户ID和部门ID),并向Keycloak查询每个请求的用户权限(也许添加一些使用寿命较短的缓存机制)。这种方法将向授权服务器生成大量请求。

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

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

1 个答案:

答案 0 :(得分:0)

我想说两个选择:

选项1

  1. 保持JWT轻巧
  2. 将OAuth2“授权代码”授予类型与刷新令牌和访问令牌一起使用
  3. 使用诸如LFU之类的驱逐策略在集中式分布式缓存系统中缓存用户权限
  4. 在访问令牌更新期间(将定期进行更新,具体取决于访问令牌有效期),获取用户的最新访问权限并刷新缓存
  5. 如果访问权限在缓存中不可用,请查询Keycloak并将条目添加到缓存中

因此

  1. 任何权利变更都将需要令牌有效期来体现
  2. 由于缓存,性能会更好

选项2

与选项1相同,除了可以使用用户权限DB上的更改数据捕获(CDC)来使高速缓存随着访问权限的更改而更新。