微服务认证策略

我很难为微服务体系结构选择一个像样的/安全的身份验证策略。我找到的关于这个主题的唯一一篇 SO 文章是这样的: 微服务体系结构中的单点登录

我的想法是在每个服务(例如认证、消息传递、通知、配置文件等)中有一个对每个用户的唯一引用(相当合乎逻辑的是他的 user_id) ,以及登录后获得当前用户的 id的可能性。

从我的研究中,我发现有两种可能的策略:

1. 共享架构

Shared architecture

在这个策略中,身份验证应用程序是其中一个服务。但是每个服务必须能够使转换 session_id = > user_id,所以它必须非常简单。这就是为什么我想到了 Redis,它将存储键: 值 session_id:user_id

2. 防火墙体系结构

Firewall architecture

在这种策略中,会话存储实际上并不重要,因为它只由身份验证应用程序处理。然后,user_id可以转发到其他服务。我想到了 Rails + Devise (+ Redis 或者 mem-cached,或者 cookie 存储,等等) ,但是有很多可能性。唯一重要的是服务 X 永远不需要对用户进行身份验证。


这两种解决办法在以下方面如何比较:

  • 保安
  • 稳健性
  • 可伸缩性
  • 易于使用

或者你可以提出另一个我没有提到的解决方案?

我更喜欢解决方案 # 1,但是还没有找到多少默认的实现来保证我正朝着正确的方向前进。

70996 次浏览

根据我的理解,解决这个问题的一个好方法是使用 OAuth 2协议 (你可以在 < a href = “ http://oauth.net/2/”rel = “ norefrer”> http://oauth.net/2/上找到更多关于它的信息。)

当您的用户登录到您的应用程序时,他们将获得一个令牌,并且使用这个令牌,他们将能够发送到其他服务以在请求中识别他们。

OAuth 2 Model

链式微服务设计实例 Architecture Model

资源:

你可使用 4号服务器进行认证及授权

你必须使用 防火墙架构,因此你对 安全性、健壮性、可伸缩性和易用性有更多的控制

简短的回答: 使用基于 Oauth2.0类令牌的身份验证,它可以用于任何类型的应用程序,如网络应用程序或移动应用程序。然后,Web 应用程序所涉及的步骤顺序是

  1. 对 ID 提供者进行身份验证
  2. 将访问令牌保存在 cookie 中
  3. 访问 webapp 中的页面
  4. 打电话给服务部

下图描述了所需的组件。这种将 Web 和数据 API 分开的体系结构将提供良好的可伸缩性、弹性和稳定性

enter image description here

通过使用 智威汤逊令牌,可以避免在后端存储会话信息。

下面是它如何看起来像使用 OAuth 2.0OpenID 连接。我还添加了用户名和密码登录到答案,因为我认为大多数人添加它作为一个登录选项太。

enter image description here 以下是解决方案的建议组成部分:

  1. 帐户服务: 负责用户创建和认证的微服务。可以为 Google,Facebook 和/或常规用户名和密码认证端点-登录,注册。 在注册-意味着通过注册端点或第一谷歌/fb 登录,我们可以在数据库中存储有关用户的信息。 在用户成功地使用其中一个选项登录之后,我们将在服务器端创建一个带有相关用户数据(如 userID)的 JWT 令牌。为了避免篡改,我们使用我们定义的令牌机密(字符串)对其进行签名。 这个令牌应该在登录响应旁边以 httpOnly cookie 的形式返回。为了安全起见,建议使用 https。关于 OpenID 连接规范,这个令牌将是 ID 令牌。

  2. 客户端 Web 应用程序: 将签名的 JWT 作为 httpOnly cookie 接收,这意味着这些数据不能被 javascript 代码访问,从安全角度来看,建议使用这些数据。当向服务器或其他微服务发送后续请求时,我们将 cookie 附加到请求上(在公理中,这意味着使用 withCredenals: true)。

  3. 需要通过令牌 对用户进行身份验证的微服务: 这些服务验证 JWT 令牌的签名,并使用为签名令牌提供的相同秘密读取它。然后他们可以访问存储在令牌上的数据,比如 userID,并获取数据库以获取关于用户的其他信息,或者执行其他任何逻辑。注意-这不是用于授权,而是用于身份验证。为此,我们有刷新令牌和访问令牌,这超出了问题的范围。

我最近创建了一个关于这个主题的详细指南,如果它对某些人有帮助的话: https://www.aspecto.io/blog/microservices-authentication-strategies-theory-to-practice/

另一个体系结构视角是使用 nuget-package (库) ,它实际上执行身份验证/令牌验证。每个微服务都将使用 Nuget 包。

另一个好处是不存在代码复制。