使用JWT和OpenID Connect

时间:2016-08-24 22:57:09

标签: api authentication jwt microservices

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

我的最大问题是身份验证(目前)。在阅读了很多文档后,似乎最好的解决方案是使用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访问令牌。我的第二个想法是,微服务可以使用与身份服务器使用的PKI相同的PKI直接签署自己的JWT。这意味着JWT可以通过几个证书签署,但来自同一个私人PKI。当微服务收到JWT时,它需要能够识别用于签署JWT的证书。我在RFC上找不到有关此问题的任何内容。我可以在令牌中添加我自己的私人声明以获得证书,但经过几天的浏览网页而没有看到这种解决方案,我想知道我是不是走错路了......总结一下,我该怎么做才能用来服务"身份验证和服务"服务服务" JWT中的身份验证?

非常感谢!

1 个答案:

答案 0 :(得分:4)

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

  1. 您可以实施新的身份验证微服务,将oAuth2访问令牌转换为JWT令牌。此微服务还将签署此JWT令牌。

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

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

  4. 每个微服务都可以配置自己的IDM凭证,当它想要调用任何其他微服务时,它可以生成一个访问令牌并调用Authentication Service来获取JWT,这可以通过调用传递给其他微服务。