163

我很难为微服务架构选择一个体面/安全的身份验证策略。我在该主题上找到的唯一 SO 帖子是:微服务架构中的单点登录

我的想法是在每项服务(例如身份验证、消息传递、通知、配置文件等)中对每个用户都有一个唯一的引用(在逻辑上然后是他的user_id),并且如果登录则可以获得当前用户的可能性id

根据我的研究,我发现有两种可能的策略:

1. 共享架构

共享架构

在此策略中,身份验证应用程序是其他服务中的一项。但是每个服务都必须能够进行转换session_id=>user_id所以它必须非常简单。这就是我想到 Redis 的原因,它可以存储 key:value session_id:user_id

2.防火墙架构

防火墙架构

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


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

  • 安全
  • 稳健性
  • 可扩展性
  • 使用方便

或者你可能会建议我在这里没有提到的另一个解决方案?

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

4

4 回答 4

68

根据我的理解,解决它的一个好方法是使用 OAuth 2 协议(您可以在http://oauth.net/2/上找到有关它的更多信息)

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

OAuth 2 模型

链式微服务设计示例 架构模型

资源:

于 2015-04-16T12:50:12.190 回答
10

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

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

下图描述了需要的组件。这种分离 web 和数据 api 的架构将提供良好的可扩展性、弹性和稳定性

在此处输入图像描述

于 2018-03-07T23:48:00.880 回答
4

您可以避免使用JWT令牌将会话信息存储在后端。

这是使用OAuth 2.0OpenID Connect的样子。我还将用户名和密码登录添加到答案中,因为我假设大多数人也将其添加为登录选项。

在此处输入图像描述 以下是解决方案的建议组件:

  1. Account-service:负责用户创建和身份验证的微服务。可以有 Google、Facebook 和/或常规用户名和密码身份验证端点的端点 - 登录、注册。在注册时 - 意味着通过注册端点或第一次 google/fb 登录,我们可以将有关用户的信息存储在数据库中。在用户使用任一选项成功登录后,我们在服务器端创建一个包含相关用户数据(如 userID)的 JWT 令牌。为了避免篡改,我们使用我们定义的令牌秘密(这是一个字符串)对其进行签名。此令牌应与登录响应一起作为 httpOnly cookie 返回。出于安全考虑,建议也仅使用 https。就 OpenID 连接规范而言,此令牌将是 ID 令牌。

  2. 客户端 Web 应用程序:接收签名的 JWT 作为 httpOnly cookie,这意味着 javascript 代码无法访问此数据,从安全角度来看是推荐的。当向服务器或其他微服务发送后续请求时,我们将 cookie 附加到请求(在 axios 中意味着使用 withCredentials: true)。

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

我最近创建了一个专门关于这个主题的详细指南,以防它帮助某人:https ://www.aspecto.io/blog/microservices-authentication-strategies-theory-to-practice/

于 2021-07-14T15:45:06.663 回答
-4

您可以使用身份服务器 4进行身份验证和授权

您必须使用防火墙架构,因此您可以更好地控制安全性、稳健性、可扩展性和易用性

于 2017-08-17T08:42:47.957 回答