我正在 NodeJS 中使用微服务开发一个应用程序。我已经构建了一个 auth api,它处理通常的注册登录等,并且它发出 JWT
如何使用它们来保护用 Express 编写的单独 API 微服务中的路由?
我是否需要使用 JWT 和密钥来解密 API 应用程序中的令牌?
您可以编写一个导入到其他微服务中的库,默认情况下要求所有路由都需要身份验证。该库可以具有在微服务级别验证 JWT 的机制,因此您无需与 auth api 对话即可查看 JWT 是否有效。参见下面的描述和图表:
您的身份验证服务器将需要成为微服务的 JWT 的单一发行者。因此,当用户登录并成功进行身份验证时,您的身份验证服务器将发出使用私钥签名的 JWT(签名必须是非对称的 - RS256 就是一个例子),您仅将其保留在身份验证服务器上;不要将此私钥提供给您希望在其中验证 JWT 的其他微服务。您可以做的是根据您签署令牌的私钥派生公钥,并将其发布到身份验证服务器上不需要身份验证的端点 - 公钥将以JWK https://www.rfc-editor.org/rfc/rfc7517(参见规范链接)。谷歌也做了类似的事情here https://www.googleapis.com/oauth2/v3/certs。然后,在每个微服务中,您的库将需要设计一种方法,每隔 X 分钟向身份验证服务器上的公钥端点发出 GET 请求,以查看是否有任何更改并在每个微服务中缓存公钥。通过将公钥缓存在微服务中,您将能够在所请求的服务内验证请求 JWT。
然后,每当请求进入您的微服务之一时,您导入的库都会检查请求的 JWT,检查其有效性,并在令牌有效时授予访问/授权。使用私钥/公钥对和非对称密钥签名的优点在于,您可以仅根据公钥验证令牌,但不能对其进行签名。因此,只要每个服务拥有来自 /cert 端点的公钥,它们就可以验证令牌,而无需与身份验证服务器通信或知道私钥。
这需要预先做更多的工作,但将来会为您带来极大的轻松、灵活性和安心,因为知道只有一个来源知道您的私钥。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)