API网关应该负责授权吗?

Arc*_*hie 9 architecture authentication authorization microservices api-gateway

目前,我有一个带有 Java/Spring Boot 的单体应用程序,具有以下端点:

  • /login
  • /logout
  • /some-resource

要访问some-resource,流程如下:

  1. 用户POST/login端点发出请求。如果凭据正确,则在标头中返回 JWT 令牌,否则返回 401。
  2. 用户将 JWT 令牌与请求一起发送到/some-resource。如果令牌有效,则返回资源,否则返回 403。

现在我想将单体拆分为 2 个服务:“AuthServer”和“SomeResourceServer”。顶部会有一个 API 网关。我正在考虑 2 种可能的方式来处理授权


选项1

  1. 用户向/login端点发出请求。API 网关将其转发到“AuthServer”。如果凭据正确,则在标头中返回 JWT 令牌,否则返回 401。- 此步骤相同
  2. 用户将 JWT 令牌与请求一起发送到/some-resource。API 网关调用“AuthServer”来验证 JWT 令牌。如果令牌有效,API 网关调用“SomeResourceServer”并返回结果。否则 403。

选项 2

  1. 用户向/login端点发出请求。API 网关将其转发到“AuthServer”。如果凭据正确,则在标头中返回 JWT 令牌,否则返回 401。- 此步骤相同
  2. 用户将 JWT 令牌与请求一起发送到/some-resource。API 网关只是将请求转发到“SomeResourceServer”。然后“SomeResourceServer”调用“AuthServer”来验证 JWT 令牌。如果令牌有效,则返回资源,否则返回 403。

在选项 1 中,API 网关负责处理授权(与“AuthServer”通信),在选项 2 中,通信在服务器之间完成。那么哪个选项更正确呢?有什么好的/坏的做法吗?或者也许是另一种方式/选择?

Anu*_*nay 5

您可以在网关剥离身份验证,这样做没有任何问题。网关上的开销很小,如果

  1. 您打算使您的所有资源安全。
  2. 您确保到达资源服务的任何调用都来自安全区域,即请求不应直接提供服务,因为它没有任何方法进行身份验证。
  3. 无授权。JWT 令牌还包含有关帮助应用程序决定授权的角色的重要信息。如果您可以丢失那部分信息,那很好。

但是,您有一个地方可以处理身份验证,并且如果您从调用中删除令牌,则根据此调用必须进行的跃点数,删除令牌可能会对您有所帮助。

另一方面,II 选项让您可以自由地确保所有服务都受到单独保护。如果您希望匿名提供某些服务的某些资源,您也可以获取该资源。您还可以控制授权位。

一切都与权衡有关。但我更喜欢第二种方法,因为我有更多的自由。

话虽如此,您确实不需要调用 auth 服务器来验证 JWT。如果您拥有签名权限的公钥,则可以独立验证 JWT 令牌。

同样在请求资源时,如果令牌无效,响应代码应为 401,如果令牌有效,主体无权访问资源,则响应应为 403。

API 网关 IMO 不应该与授权(可能是身份验证)有关,因为它是由服务决定的,并且因服务和资源而异,应该留给服务来处理。

  • 有两种类型的令牌访问令牌和刷新令牌。AT 是短暂的,我们可以只用公钥独立验证它。注销场景可以由刷新令牌处理。即注销后 AT 不会刷新。如果您的应用程序可以忍受 AT 必须存活的那分钟时间,我认为您可以避免服务器调用。谈到角色,它们也可以成为令牌的一部分。没有人可以修改它。表单微服务的观点再次调用身份验证服务器可能是一个主要缺点,这就是 JWT 的亮点。但这一切都与权衡有关。 (2认同)