带有passport.js的微服务认证架构

Posted

技术标签:

【中文标题】带有passport.js的微服务认证架构【英文标题】:Microservices authentication architecture with passport.js 【发布时间】:2016-11-12 01:02:28 【问题描述】:

我正在编写一个玩具应用程序,用于在 nodejs (expressjs) 上练习微服务和身份验证。

我有一个反应客户端、一个身份验证服务和其他服务(到目前为止,它们只是响应“嗨”)。

客户端将托管在 CDN 中。 身份验证服务侦听端口 5000(例如) 其余服务侦听端口 6000-6100。 我有一个 redis 数据库来存储会话信息(由 twitter 提供的 oauth 令牌)。 存储应用信息的mongodb(与本题无关)。

这个想法是未经身份验证的客户端通过单击 Twitter 按钮 (SSO) 进入身份验证服务。然后 auth 服务获取生成的 twitter 誓言令牌,并将此令牌设置在 redis 存储中。然后其他服务可以访问令牌,因此他们可以通过检查它是否已经存在于 redis 存储中来了解请求是否经过身份验证(如果用户删除其帐户,它也会从 redis 存储中删除) . 一旦通过身份验证,我就会从客户端到服务器来回发送 twitter 令牌。

我发现这种方法非常简单(其他人使用 nginx 代理进行身份验证,但我认为没有理由这样做,除非服务托管在不同的域中,但我不太了解)所以我很担心例如,我缺少一些关于安全性的内容。

问题:

    这种方法正确吗? 分享 twitter 令牌是否安全(我认为是)? 这里有没有我没有注意到的安全问题?

【问题讨论】:

【参考方案1】:

使用这种方法,您必须在所有服务中验证令牌,如果您对此没问题,那么您可能没问题。

twitter 访问令牌可能有一个过期时间,这将需要使用刷新令牌从身份验证服务获取新的访问令牌:

当访问令牌过期时,您会从您尝试与之通信的服务 X 向客户端返回 401。 客户端必须调用 Auth 服务提供刷新令牌,获取新的访问令牌 最后,客户端将使用这个新的访问令牌再次访问服务 X,对其进行验证并从服务 X 获得预期的响应。

在我最近的任务中,我编写了一个代理所有令牌的微服务,使用这种方法我的代理处理了从身份验证到角色的所有事情,并为过期令牌发送 401 和撤销刷新令牌等。我认为这给了我更大的分离的担忧。

重要提示:在上面的刷新令牌场景中,我的代理只会遇到无效/过期访问令牌的负载,而在您的场景中,可以使用无效令牌访问任何服务...

另一种方法是让 Service-A 和 Service-B 调用 auth 服务来验证令牌,但这会在服务之间推断出更多的流量,因为每个带有令牌的 HTTP 请求都必须经过验证。在这种情况下,无效的令牌请求也会到达您的 Service X 并因此推断出一些负载...

【讨论】:

很遗憾没有,删除链接。

以上是关于带有passport.js的微服务认证架构的主要内容,如果未能解决你的问题,请参考以下文章

基于STS和JWT的微服务身份认证

微服务认证架构

微服务架构的登陆认证问题

Day915.安全认证架构演进:微服务阶段 -SpringBoot与K8s云原生微服务实践

《云原生入门级开发者认证》学习笔记之微服务架构介绍

《云原生入门级开发者认证》学习笔记之微服务架构介绍