我有两个独立的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
上,因为它不允许跨源访问。
答案 0 :(得分:3)
其他人未提及的另一个细节:
如果您的客户使用的是网络浏览器,并且您希望使用这两种服务对用户进行身份验证,而无需重新登录(单点登录)
E.g。如果您的域名是example.com,则服务A位于example.com,服务B位于b.example.com。
example.com
此方法仅在您在相同的根域运行且您的身份验证服务必须位于根域时才有效。如果您有不同的设置,我建议您查看单点登录产品(例如Central Authentication Service)
答案 1 :(得分:2)
使用RSA生成JWT。您可以将公钥提供给所有其他微服务。如果客户端使用CORS直接与不同的服务(而不是API网关)通信,请像往常一样将JWT打包在Authorization标头中。
答案 2 :(得分:2)
如果您的服务器共享密钥,您可以在任何服务器上加密和解密令牌。在令牌内,您可以写出用户是谁以及他拥有的权限。每当用户想要执行某些限制性操作时,您解密该令牌并检查他是否有权执行他想要的操作。不要忘记给令牌一个生存的时间,这样它就不会永远持续下去。
我不是js guru所以我不会粘贴代码,但你应该能够找到一个例子here