我应该两次验证 JWT(在 API 网关和服务本身中)吗?

Posted

技术标签:

【中文标题】我应该两次验证 JWT(在 API 网关和服务本身中)吗?【英文标题】:Should I validate JWT twice (in API gateway and service itself)? 【发布时间】:2021-10-02 03:24:45 【问题描述】:

我目前正在为我们的服务设置 API 网关。 API 网关处理令牌验证(通过 OpenID Connect)。仅当令牌有效时,请求才会路由到目标后端服务。

我是否也应该在后端服务本身中验证令牌?服务需要来自令牌的信息来修改数据库查询(仅读取用户被允许的资源)。但这意味着我必须再次验证令牌,对吧?

这是最佳做法吗?我忽略了什么吗?在这种情况下,在 API 网关验证令牌是否有意义?

【问题讨论】:

在网关上验证 JWT 的一般模式是有意义的,而不是在其背后的服务上。在其他情况下,服务可能无论如何都不需要 JWT。 但是服务需要知道哪个用户在请求一个特定的资源。只有服务可以实现授权(不是认证),对吧?如果没有 JWT,服务应该如何实现呢? 我不是说不要将 JWT 传递到网关之外,我是说在网关处进行身份验证检查,让网关后面的服务不必担心这个问题。 【参考方案1】:

我遇到了同样的问题,经过一些研究后,我意识到调用 IdP 两次是合理的(一次来自 API 网关,一次来自其背后的 API 服务)。

对于来自 API 网关的调用,它会对调用者进行身份验证,以确保调用者持有有效的令牌。这在 API 网关模式中似乎是必要的。

对于来自后端 API 服务的调用,它是可选的。如果令牌(例如 JWT)本身包含足够的用户信息用于授权或其他与用户相关的用户案例,则无需调用 IdP(因为网关确保令牌有效,因此无需自省)。但是,它也可以使用令牌从后端 API 服务调用 IdP 的userinfo endpoint 以检索其他需求信息,或根据您自己的用例对 IdP 进行其他调用。

总之,api网关模式不需要两次验证token,但不禁止用同一个token调用IdP两次。

【讨论】:

以上是关于我应该两次验证 JWT(在 API 网关和服务本身中)吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Kong API 网关中使用 .jks 密钥对 JWT 令牌进行身份验证

Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

使用带有 KONG API 网关的 cookie 进行 JWT 身份验证

如何在 api 网关架构中获取 JWT 令牌

我是不是需要在 Lambda 和 API 网关中验证 AWS Cognito 令牌?

WSO2 APIM - 在 JWT 有效负载中添加用户角色