Arc*_*hie 9 architecture authentication authorization microservices api-gateway
目前,我有一个带有 Java/Spring Boot 的单体应用程序,具有以下端点:
/login/logout/some-resource要访问some-resource,流程如下:
POST向/login端点发出请求。如果凭据正确,则在标头中返回 JWT 令牌,否则返回 401。/some-resource。如果令牌有效,则返回资源,否则返回 403。现在我想将单体拆分为 2 个服务:“AuthServer”和“SomeResourceServer”。顶部会有一个 API 网关。我正在考虑 2 种可能的方式来处理授权
/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 中,通信在服务器之间完成。那么哪个选项更正确呢?有什么好的/坏的做法吗?或者也许是另一种方式/选择?
您可以在网关剥离身份验证,这样做没有任何问题。网关上的开销很小,如果
但是,您有一个地方可以处理身份验证,并且如果您从调用中删除令牌,则根据此调用必须进行的跃点数,删除令牌可能会对您有所帮助。
另一方面,II 选项让您可以自由地确保所有服务都受到单独保护。如果您希望匿名提供某些服务的某些资源,您也可以获取该资源。您还可以控制授权位。
一切都与权衡有关。但我更喜欢第二种方法,因为我有更多的自由。
话虽如此,您确实不需要调用 auth 服务器来验证 JWT。如果您拥有签名权限的公钥,则可以独立验证 JWT 令牌。
同样在请求资源时,如果令牌无效,响应代码应为 401,如果令牌有效,主体无权访问资源,则响应应为 403。
API 网关 IMO 不应该与授权(可能是身份验证)有关,因为它是由服务决定的,并且因服务和资源而异,应该留给服务来处理。
| 归档时间: |
|
| 查看次数: |
2191 次 |
| 最近记录: |