验证 API 密钥和 JWT 令牌是微服务的责任吗?

Posted

技术标签:

【中文标题】验证 API 密钥和 JWT 令牌是微服务的责任吗?【英文标题】:Is it the microservice's responsibility to validate the API key and JWT token? 【发布时间】:2021-09-30 17:38:11 【问题描述】:

我的微服务将通过 2 种方式调用:1. 由公共网站的未经身份验证的用户调用。 2. 由内部 UI 的经过身份验证的用户执行管理功能。

我计划使用带有 JWT 令牌的 OIDC 来验证管理员用户从管理 UI 发出的 API 调用。该令牌将包含声明,微服务将使用该声明来确定用户是否有权访问此 API。

我计划使用来自面向公众的网站的 API 密钥来进行未经身份验证的用户进行的 API 调用。微服务将验证 API 请求标头中的 API 密钥,以确定 API 调用是否来自可信来源。

问题

这是处理身份验证和授权的正常/可接受的方式吗? 评估 JWT 令牌和 API 密钥是否由微服务负责?在我的设计中,每个微服务都必须这样做。

【问题讨论】:

【参考方案1】:

是的,验证 API 密钥和 JWT 令牌是微服务的责任,除非您使用的是服务网格。

如果您有许多微服务都直接交互(发送/接收调用、发现新实例等),那么微服务需要进行此验证。这意味着每个服务都需要使用框架/库来实现验证逻辑(或复制粘贴代码,这在某些情况下确实有意义)。他们还需要分发和轮换的 JWT 公钥。

但是,如果您使用代理/服务网格来处理您的网络调用,那么您很可能会将其委托给代理来处理。例如,Envoy 代理包括一个jwt filter,可以在网络层进行 JWT 解码。根据您的架构和服务设计,在代理层处理解码可能比自己实现要容易一些。这里有一些权衡,因为您需要部署和维护代理并可能重新设计您的应用程序以解析来自代理设置的标头或 cookie 的决定(是/否,管理员/未经身份验证的用户)。

【讨论】:

以上是关于验证 API 密钥和 JWT 令牌是微服务的责任吗?的主要内容,如果未能解决你的问题,请参考以下文章

我需要为每个用户单独管理 jwt 密钥吗?

带有 API 密钥和 JWT 令牌的 Net Core API

DefaultJwtParser:如何仅解码 JWT? (没有密钥,没有验证)

Pubsub 使用错误的密钥签署 JWT 令牌以进行推送

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

使用 json Web 令牌的 API 身份验证 jwt-simple