在 API 网关级别与在单个微服务级别解码 OAuth2 JWT

Mun*_*del 5 spring-boot spring-security-oauth2 microservices

我使用 Spring Boot 1.5.x + OAuth2 和 JWT 开发了一组微服务(资源服务器)。现在每个微服务都使用 Spring Security 进行保护,即 JWT 访问令牌在单个资源服务器级别进行验证。API Gateway 没有适当的 spring 安全性,因此它只是将请求路由到适当的服务器并将身份验证标头传播到下游服务。

我想知道与仅在 API 网关级别验证 AccessToken 的设置相比,此设置是否有任何缺点。或者这只是一个意见问题?在 API 网关级别保持安全性是否违反了松散耦合的原则,因为每个微服务可能会更好地理解给定用户在其自身上下文中的角色?

war*_*gre 3

API 管理可以对您的 JWT 进行少量检查(早期失败),但是您的微服务是唯一可以真正管理所有安全内容的服务!

如果您仅在 api 管理上设置安全性,则意味着可以访问您网络的人将能够在未经身份验证的情况下将请求推送到您的 API。您将无法记录谁做了什么。最后,如果您需要设置某种 ACL,这是不可能的(当您要求列出订单时,您只能列出您的订单)。

也许您会考虑在 api 管理层上解码 JWT,并将带有用户名的标头推送到后端,以防止我上面谈到的所有事情,但我认为这并不是一个好的做法。

首先,接入网络意味着我可以成为任何人。那么 JWT 不仅仅是一个用户名。例如,也许您在身份验证层上使用范围。(范围读取命令/范围修改命令/范围删除命令)。这对于限制应用程序可以执行的操作(在 client_id 级别)或用户接受向应用程序提供的内容(范围共享电子邮件...)很有用。对于后台的 JWT 是强制性的。

好吧,你可以像用户名一样提取 api 管理上的数据,并放置特定的标头来调用后端,但真的吗?为什么要做特定的事情?oauth2 与 JWT 可以为您做到这一点。