微服务认证策略

时间:2015-04-15 08:10:33

标签: authentication architecture microservices

我很难为微服务架构选择合适/安全的身份验证策略。我在这个主题上找到的唯一SO帖子是这一个:Single Sign-On in Microservice Architecture

我的想法是在每个服务(例如,身份验证,消息,通知,个人资料等)中为每个用户提供一个唯一的引用(在逻辑上与他的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存储等),但有很多可能性。唯一重要的是Service X永远不需要对用户进行身份验证。


这两种解决方案如何比较:

  • 安全
  • 鲁棒性
  • 可扩展性
  • 易用性

或许你会建议我在这里没有提到的另一种解决方案?

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

我希望我的问题不会被关闭。我真的不知道还能在哪里问它。

提前致谢

5 个答案:

答案 0 :(得分:55)

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

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

OAuth 2 Model

链式微服务设计示例 Architecture Model

资源:

答案 1 :(得分:2)

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

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

enter image description here 以下是该解决方案的建议组件:

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

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

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

我最近专门针对此主题创建了详细指南,以防万一:https://www.aspecto.io/blog/microservices-authentication-strategies-theory-to-practice/

答案 2 :(得分:0)

您可以使用idenitty server 4进行身份验证和授权

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

答案 3 :(得分:0)

应使用API​​网关模式使用OpenID Connect实现此功能。用户将通过IDP进行身份验证,并从授权服务器获取JWT令牌。现在,API网关系统可以将此令牌存储在Redis数据库中,并在浏览器上设置cookie。 API网关将使用cookie来验证用户请求,并将令牌发送到微服务。

API Gateway充当所有类型的客户端应用程序的单一入口点,例如公共java脚本客户端应用程序,传统Web应用程序,本机移动应用程序和微服务架构中的第三方客户端应用程序。

您可以在http://proficientblog.com/microservices-security/

上找到有关它的更多详细信息

答案 4 :(得分:0)

简答:使用Oauth2.0类型的基于令牌的身份验证,可用于任何类型的应用程序,如webapp或移动应用程序。然后,Web应用程序涉及的步骤顺序为

  1. 针对ID提供商进行身份验证
  2. 将访问令牌保留在Cookie
  3. 访问webapp中的页面
  4. 致电服务
  5. 下图描绘了所需的组件。这种将Web和数据apis分开的架构将提供良好的可扩展性,弹性和稳定性

    enter image description here