使用 JWT 和 OpenID Connect 在微服务中进行客户端身份验证

Posted

技术标签:

【中文标题】使用 JWT 和 OpenID Connect 在微服务中进行客户端身份验证【英文标题】:Client authentication in microservices using JWT and OpenID Connect 【发布时间】:2017-01-01 05:37:02 【问题描述】:

我对微服务架构中的身份验证有一些疑问。我现在有一个单体应用程序,我的目标是将应用程序拆分为小型微服务。

我最大的问题是身份验证(目前)。在阅读了很多文档之后,似乎最好的解决方案是使用 OpenID Connect 对用户进行身份验证,以检索可以通过请求传递给微服务的 JWT。

此外,为避免使用多个端点,您可以部署 API 网关以仅为最终用户提供一个端点。好的,现在我对这个架构有两个问题。

认证的标准流程是:

用户在 OpenID Connect 中联系我的身份服务器并使用隐式流连接并获取 id_token (JWT) 和 access_token。用户现在可以使用这个 access_token 联系我的 API。 API 网关将使用身份服务器验证 access_token 并检索 JWT 以将其添加到微服务 API 的子请求中。

1/ API Gateway如何从access_token中获取JWT?根据我从文档 (http://openid.net/specs/openid-connect-core-1_0.html) 中获得的信息,它可以联系“/userinfo”端点,但它只会获得 JSON 格式而不是 JWT...

2/ 我想在我的微服务之间允许经过身份验证的调用。所以每个微服务都需要能够生成一个 JWT 来直接联系其他微服务。我的第一个想法是联系身份服务器。但是使用 OAuth2 客户端凭据流,我不会检索 id_token 或 JWT。只是一个没有 JWT 的经典 OAuth2 访问令牌。我的第二个想法是,微服务可以使用与身份服务器使用的 PKI 相同的 PKI 颁发的证书直接签署自己的 JWT。这意味着 JWT 可以由多个证书签名,但来自同一个私有 PKI。当微服务收到 JWT 时,它需要能够识别用于签署 JWT 的女巫证书。我在 RFC 上没有找到关于这个问题的任何内容。我可以在令牌中添加我自己的私人声明以获得证书,但是经过几天浏览网页而没有看到这种解决方案,我想知道我是否没有走错路......总结一下,如何我可以在 JWT 中执行“用户到服务”身份验证和“服务到服务”身份验证吗?

非常感谢!

【问题讨论】:

【参考方案1】:

我正在实施类似的解决方案。不确定它是否会完全解决您的问题,但是,我希望它有所帮助:

    您可以实现一个新的身份验证微服务来将您的 oAuth2 访问令牌转换为 JWT 令牌。此微服务还将签署此 JWT 令牌。

    您的 API 网关会将所有客户端请求路由到身份验证服务,该服务将从 IDM 验证此令牌并将其转换为已签名的 JWT 令牌。

    API 网关会将此 JWT 令牌传递给其他微服务,这些微服务将验证来自身份验证服务的公钥的签名。如果签名有效,则可以从中提取角色进行授权。

    每个微服务都可以配置自己的 IDM 凭据,当它想要调用任何其他微服务时,它可以生成访问令牌并调用身份验证服务以获取 JWT,该 JWT 可以在调用中传递给其他微服务。

【讨论】:

以上是关于使用 JWT 和 OpenID Connect 在微服务中进行客户端身份验证的主要内容,如果未能解决你的问题,请参考以下文章

同一站点中的 asp net core 2.0 JWT 和 Openid Connect 身份验证

OpenID Connect JWT 令牌验证和后端 api 的使用策略 - jwks 还是会话?

Okta 使用 OpenID Connect 配置中的公钥验证 JWT 令牌

当我完全信任依赖方时,为啥我应该遵循 Oauth2.0 和 OpenID Connect Protocole 而不是仅使用 JWT 的基本身份验证?

Asp.Net Core API OpenId-Connect 身份验证与 JWT 令牌使用 IdentityModel

验证 Google OpenID Connect JWT ID 令牌