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

Javascript 身份验证如何跨微服务工作?,javascript,node.js,authentication,jwt,microservices,Javascript,Node.js,Authentication,Jwt,Microservices,我有两个单独的Node.js服务 服务A负责验证用户。如果用户成功登录,该用户将被重定向到服务B(托管在a托管的域服务的子域上) 我使用的是身份验证 问题:服务B如何知道用户是否经过身份验证 我设想服务B可以知道它们是否经过身份验证的一种方法是,要求服务A检查每个服务B请求的JWT。但是,当客户机将被重定向到新的来源时,服务A应该如何向客户机发送JWT呢 这样做安全吗 window.location.href = 'https://b.example.com?jwt=tokenhere' 我不

我有两个单独的Node.js服务

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

我使用的是身份验证

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

我设想服务
B
可以知道它们是否经过身份验证的一种方法是,要求服务
A
检查每个服务
B
请求的JWT。但是,当客户机将被重定向到新的来源时,服务
A
应该如何向客户机发送JWT呢

这样做安全吗

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

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

使用RSA生成JWT。您可以使公钥可用于所有其他微服务。如果客户端使用CORS直接与不同的服务进行通信(与API网关相比),请像往常一样将JWT打包到授权标头中。

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


我不是js大师,所以我不会粘贴代码,但您应该能够找到一个示例,其他人没有涉及的另一个细节:

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

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

  • 向example.com上的身份验证服务发送登录请求
  • 身份验证服务验证凭据,如果它们匹配,则向域设置为
    example.com
  • 客户端接收并存储cookie
  • 在将来的所有请求中,浏览器将向服务A和服务B发送cookie
  • 在服务A和服务B中验证cookie中接收到的JWT(请参阅其他人的答案)

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

    为什么微服务需要跨源?我们运行一个网站,不仅实现了多种服务,而且实现了多种编程语言。我们通常不使用CORS,除非我们需要跨越http/https边界。使用API/服务网关。他们不需要是复杂的野兽。我们只是使用Nginx。我以前在一个网站上使用过Apacheproject@slebetman,谢谢你的回复。我的想法是,某些域
    example.com
    允许用户登录。登录后,用户将重定向到与用户的公司名称匹配的子域,
    companyname.example.com
    。我见过各种SaaS应用程序都做过类似的事情,我很想知道如何用微服务实现这一点。您所指的网站是Saas应用程序吗?@slebetman,另外,如果您有任何关于在Node.js中实现微服务的推荐资源,我很喜欢您共享这些资源。谢谢,我完全忘记了Cookie可以跨根域和子域访问。在我看来,这是对我的问题最简单的回答。然而,我将学习一般的微服务体系结构,看看是否有一种方法可以使用API/服务网关在同一来源上的所有微服务实现相同的子域结果。