使用JWT验证单独的API微服务

时间:2019-05-15 10:35:47

标签: express jwt microservices

我正在使用NodeJS中的微服务开发一个应用程序。我已经建立了一个auth api,可以处理通常的注册登录等,并且它会发出JWT的

如何在Express编写的单独的API微服务中使用这些保护路由?

我需要使用带有密码的JWT来解密API应用中的令牌吗?

2 个答案:

答案 0 :(得分:1)

一种常见的模式是使用API​​网关作为整个微服务架构的入口点。身份验证的传入请求将被路由到适当的微服务。如果提供的凭据正确,则将新的JWT返回到网关,然后将其转发给调用方。对于构成您的应用程序的实际微服务API,网关将在允许请求访问微服务之前检查传入的JWT是否有效。

为简单起见,此答案省略了一些内容。例如,通常您希望拥有一个授权微服务,该服务决定允许用户执行的 。另外,可能涉及实现JWT。您可能需要一个缓存层来跟踪列入白名单和/或列入黑名单的JWT。

答案 1 :(得分:1)

您可以编写一个导入到其他微服务中的库,该库默认需要所有路由才能进行身份验证。该库可能具有在微服务级别验证JWT的机制,因此您无需与您的auth api进行对话即可查看JWT是否有效。请参见下面的说明和图表:

您的身份验证服务器将需要成为微服务的JWT的唯一颁发者。因此,当用户登录并成功进行身份验证时,您的身份验证服务器将发布一个使用私钥签名的JWT(签名必须不对称-RS256是一个示例),您只需保留在身份验证服务器上即可;不要将此私钥提供给您希望在其中验证JWT的其他微服务。您可以做的是根据与您的令牌进行签名的私钥派生公钥,并将其发布到不需要身份验证的身份验证服务器上的端点-公钥将以JWK的形式表示(请参阅规格链接)。 Google做了类似的here。然后,在您的每个微服务中,您的库都需要设计一种方法,每隔X分钟向auth服务器上的公钥终结点发出GET请求,以查看是否有任何更改并在每个微服务中缓存公钥。通过将公钥缓存在您的微服务中,您将能够在请求的服务内验证请求的JWT。

然后,每当一个微服务中有一个请求进入时,您导入的库将检查发出请求的JWT,检查其有效性,并在令牌有效时授予访问/授权。使用私钥/公钥对和非对称密钥签名的好处在于,您可以仅基于公钥来验证令牌,但不能对其进行签名。因此,只要每个服务都具有来自/ cert端点的公钥,它们就可以验证令牌,而无需与auth服务器交谈或知道私钥。

这将需要做更多的事,但是将来,只有一个来源知道您的私钥,您才能获得大量的轻松,灵活和安心。

enter image description here