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

时间:2017-03-26 18:31:33

标签: javascript node.js authentication jwt microservices

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

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

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

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

我认为,如果服务B已经过身份验证或者未经过身份验证,则可以通过请求服务A检查每个服务请求{JWT} B 。但是,当客户端被重定向到新的源时,Service A应该如何将JWT发送到客户端?

做以下事情是否安全:

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

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

3 个答案:

答案 0 :(得分:3)

其他人未提及的另一个细节:

如果您的客户使用的是网络浏览器,并且您希望使用这两种服务对用户进行身份验证,而无需重新登录(单点登录)

E.g。如果您的域名是example.com,则服务A位于example.com,服务B位于b.example.com。

  1. 向example.com的身份验证服务发送登录请求
  2. 验证服务验证凭据,如果匹配,则将cookie发送回客户端,并将域设置为example.com
  3. 客户收到并存储Cookie
  4. 在将来的所有请求中,浏览器会将cookie发送到服务A和服务B
  5. 在服务A和服务B中验证cookie中收到的JWT(参见其他人的答案)
  6. 此方法仅在您在相同的根域运行且您的身份验证服务必须位于根域时才有效。如果您有不同的设置,我建议您查看单点登录产品(例如Central Authentication Service

答案 1 :(得分:2)

使用RSA生成JWT。您可以将公钥提供给所有其他微服务。如果客户端使用CORS直接与不同的服务(而不是API网关)通信,请像往常一样将JWT打包在Authorization标头中。

答案 2 :(得分:2)

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

我不是js guru所以我不会粘贴代码,但你应该能够找到一个例子here