目前我有一个带有Java / Spring Boot的monolith应用程序以下端点:
/login
/logout
/some-resource
要访问some-resource
,请遵循以下流程:
POST
端点发出/login
个请求。如果凭据正确,则在标头中返回JWT标记,否则返回401。/some-resource
。如果令牌有效,则返回资源,否则返回403。现在我想将monolith分成2个服务:“AuthServer”和“SomeResourceServer”。顶部会有一个API网关。我正在考虑两种可能的方式来处理授权
/login
端点发出请求。 API网关将其转发到“AuthServer”。如果凭据正确,则在标头中返回JWT令牌,否则返回401. - 此步骤相同 /some-resource
。 API网关调用“AuthServer”来验证JWT令牌。如果令牌有效,则API网关调用“SomeResourceServer”并返回结果。否则403。/login
端点发出请求。 API网关将其转发到“AuthServer”。如果凭据正确,则在标头中返回JWT令牌,否则返回401. - 此步骤相同 /some-resource
。 API网关只是将请求转发给“SomeResourceServer”。然后“SomeResourceServer”调用“AuthServer”来验证JWT令牌。如果令牌有效,则返回资源,否则返回403。在选项1中,API网关负责处理授权(与“AuthServer”通信),在选项2中,通信在服务器之间完成。那么哪个选项更正确?有没有好/坏的做法?或者可能是另一种方式/选择?
答案 0 :(得分:4)
您可以在网关处剥离身份验证,这样做没有任何问题。网关上有轻微的开销,如果
,这不会成为问题但是,您有一个地方可以处理身份验证,如果您从呼叫中删除令牌,则根据此呼叫必须进行的跃点数量,此删除令牌可能会对您有所帮助。
另一方面,II选项为您提供所有服务单独保护的自由。如果您希望匿名提供某些服务的某些资源,您也可以获得该资源。 您还可以控制授权位。
这完全取决于权衡。但我更喜欢第二种方法,因为我有更多的自由。
话虽如此,你真的不需要调用auth服务器来验证JWT。如果您拥有签名权限的公钥,则可以单独验证JWT令牌。
同样在请求资源时,如果令牌无效,则响应代码应为401,如果令牌有效,则Principal无权访问资源,响应应为403。
API网关IMO不应该与授权(认证可能)有任何关系,因为它是由服务决定的,因服务和服务以及资源而异,应该由服务来处理。