API 网关是否应该负责授权?

Should API gateway be responsible for authorisation?

目前我有一个整体式应用程序 Java/Spring 启动以下端点:

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

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

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


选项 1

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

选项 2

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

在选项 1 中,API 网关负责处理授权(与“AuthServer”通信),在选项 2 中,通信在服务器之间完成。那么哪个选项更正确呢?有什么good/bad做法吗?或者另一个 way/option?

您可以在网关处取消身份验证,这样做没有任何问题。网关上有轻微的开销,如果

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

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

另一方面,II 选项为您提供了所有服务都受到单独保护的自由。如果您希望某些服务的某些资源可以匿名使用,您也可以这样做。 您还可以控制授权位。

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

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

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

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