我对微服务架构中的身份验证有一些疑问。我现在有一个整体应用程序,我的目标是将应用程序拆分为小型微服务。
我最大的问题是身份验证(目前)。阅读大量文档后,似乎最好的解决方案是使用 OpenID Connect 对用户进行身份验证,以检索可以通过请求传递给微服务的 JWT。
此外,为了避免拥有多个端点,您可以部署 API Gateway,以便最终用户只有一个端点。好的,现在我对这个架构有两个问题。
身份验证的标准流程是:
用户通过隐式流联系 OpenID Connect 中的我的身份服务器并获取 id_token (JWT) 和 access_token。用户现在可以使用此 access_token 联系我的 API。 API 网关将使用身份服务器验证 access_token,并检索 JWT 以将其添加到微服务 API 的子请求中。
1/API网关如何从access_token获取JWT?根据我从文档( http://openid.net/specs/openid-connect-core-1_0.html )中得到的信息,它可以联系“/userinfo”端点,但它只会获取 JSON 格式而不是 JWT...
2/我想允许我的微服务之间进行经过身份验证的调用。因此每个微服务都需要能够生成 JWT 来直接联系其他微服务。我的第一个想法是联系身份服务器。但通过 OAuth2 客户端凭据流程,我不会检索 id_token 或 JWT。只是一个没有 JWT 的经典 OAuth2 访问 token 。我的第二个想法是,微服务可以使用与身份服务器使用的同一 PKI 颁发的证书直接签署自己的 JWT。这意味着 JWT 可以由来自同一个私有(private) PKI 的多个证书进行签名。当微服务收到 JWT 时,它需要能够识别用于签署 JWT 的女巫证书。我在 RFC 上没有找到任何关于此问题的内容。我可以在 token 中添加我自己的私有(private)声明以获得证书,但是在浏览网页几天后没有看到这种解决方案,我想知道我是否走错了路......总而言之,如何我可以在 JWT 中执行“用户到服务”身份验证和“服务到服务”身份验证吗?
非常感谢!
最佳答案
我正在实现类似的解决方案。不确定它是否能完全解决您的问题,但是,我希望它有所帮助:
您可以实现新的身份验证微服务,将 oAuth2 访问 token 转换为 JWT token 。此微服务还将签署此 JWT token 。
您的 API 网关会将所有客户端请求路由到身份验证服务,该服务将验证来自 IDM 的此 token 并将其转换为签名的 JWT token 。
API 网关会将此 JWT token 传递给其他微服务,这些微服务将验证身份验证服务公钥的签名。如果签名有效,则可以从中提取角色进行授权。
每个微服务都可以配置自己的 IDM 凭据,当它想要调用任何其他微服务时,它可以生成访问 token 并调用身份验证服务来获取 JWT,该 JWT 可以在调用中传递给其他微服务。
关于api - 使用 JWT 和 OpenID Connect 在微服务中进行客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39134238/