身份验证如何跨微服务工作?

How could authentication work across microservices?

我有两个独立的 Node.js 服务。

服务A 负责对用户进行身份验证。如果用户成功登录,用户将被重定向到服务 B(托管在域服务 A 子域 上)。

我正在使用 JWT 进行身份验证。

问题:服务B如何知道用户是否已通过身份验证?

我想象服务 B 可以知道他们是否经过身份验证的一种方法是要求服务 A 检查每个服务请求的 JWT B .但是,当客户端要重定向到新源时,服务 A 应该如何将 JWT 发送给客户端?

做这样的事情安全吗:

window.location.href = 'https://b.example.com?jwt=tokenhere'

我不相信将 JWT 存储在 localStorage 上,因为它不允许跨源访问。

为您的 JWT 生成使用 RSA。您可以使 public 密钥可用于所有其他微服务。如果客户端使用 CORS 直接与不同的服务对话(相对于 API 网关),像往常一样在授权 header 中打包 JWT。

如果您的服务器共享一个密钥,您可以在任何服务器上加密和解密令牌。在令牌中,您可以写下用户是谁以及他拥有什么权限。每当用户想要执行某些受限操作时,您都会解密令牌并检查他是否有权执行他想执行的操作。不要忘记给令牌一个生存时间,这样它就不会永远持续下去。

我不是 js 大师所以我不会粘贴代码,但你应该能够找到示例 here

另一个其他人没有提到的细节:

如果您的客户正在使用 Web 浏览器,并且您希望用户通过两种服务的身份验证而无需重新登录(单点登录)

例如如果您的域是 example.com,服务 A 位于 example.com,服务 B 位于 b.example.com.

  1. 在 example.com
  2. 向身份验证服务发送登录请求
  3. Auth 服务验证凭据,如果它们匹配,则将 cookie 发送回客户端,域设置为 example.com
  4. 客户端接收并存储 cookie
  5. 对于所有未来的请求,浏览器会将 cookie 发送到服务 A 和服务 B
  6. 在服务A和服务B中验证cookie中收到的JWT(见其他人的回答)

只有当您 运行 在同一个根域上并且您的身份验证服务必须在根域上时,此方法才有效。如果您有不同的设置,我建议您查看单点登录产品(例如 Central Authentication Service