API网关应该负责授权吗?

时间:2018-06-05 12:32:36

标签: authentication architecture authorization microservices api-gateway

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

  • /login
  • /logout
  • /some-resource

要访问some-resource,请遵循以下流程:

  1. 用户向POST端点发出/login个请求。如果凭据正确,则在标头中返回JWT标记,否则返回401。
  2. 用户将JWT令牌连同请求一起发送给/some-resource。如果令牌有效,则返回资源,否则返回403。
  3. 现在我想将monolith分成2个服务:“AuthServer”和“SomeResourceServer”。顶部会有一个API网关。我正在考虑两种可能的方式来处理授权

    选项1

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

      1. 用户向/login端点发出请求。 API网关将其转发到“AuthServer”。如果凭据正确,则在标头中返回JWT令牌,否则返回401. - 此步骤相同
      2. 用户将JWT令牌连同请求一起发送给/some-resource。 API网关只是将请求转发给“SomeResourceServer”。然后“SomeResourceServer”调用“AuthServer”来验证JWT令牌。如果令牌有效,则返回资源,否则返回403。
      3. 在选项1中,API网关负责处理授权(与“AuthServer”通信),在选项2中,通信在服务器之间完成。那么哪个选项更正确?有没有好/坏的做法?或者可能是另一种方式/选择?

1 个答案:

答案 0 :(得分:4)

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

,这不会成为问题
  1. 您打算确保所有资源的安全。
  2. 您确保到达资源服务的任何呼叫都来自安全区域,即请求不应直接服务,因为它无法进行身份验证。
  3. 没有授权。 JWT令牌还包含有助于应用程序决定授权的角色的重要信息。 如果您可以放弃那些信息,那就好了。
  4. 但是,您有一个地方可以处理身份验证,如果您从呼叫中删除令牌,则根据此呼叫必须进行的跃点数量,此删除令牌可能会对您有所帮助。

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

    这完全取决于权衡。但我更喜欢第二种方法,因为我有更多的自由。

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

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

    API网关IMO不应该与授权(认证可能)有任何关系,因为它是由服务决定的,因服务和服务以及资源而异,应该由服务来处理。