使用 JWT 对单独的 API 微服务进行身份验证

Luk*_*uke 4 express jwt microservices

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

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

我是否需要使用带有密钥的 JWT 来解密 API 应用程序中的令牌?

Joe*_*erg 25

您可以编写一个库,将其导入到其他微服务中,默认情况下需要所有路由都需要身份验证。这个库可以有一个机制来在微服务级别验证 JWT,所以你永远不需要与你的 auth api 交谈来查看 JWT 是否有效。请参阅下面的说明和图表:

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

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

这将需要更多的前期工作,但会让您在未来轻松、灵活和安心,因为只有一个来源知道您的私钥。

在此处输入图片说明

  • 这种公共库的缺点是,对库的任何更改都会导致所有微服务需要拉取升级+重新部署。当您只调用身份验证微服务时,不需要这样做。 (5认同)

Tim*_*sen 6

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

为简单起见,此答案省略了一些内容。举例来说,往往你会希望有一个授权的microService,它决定哪些用户被允许做。此外,还可能涉及实现 JWT。您可能需要一个缓存层来跟踪列入白名单和/或列入黑名单的 JWT。