微服务认证策略


138

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

我的想法是在每个服务(例如身份验证,消息传递,通知,配置文件等)中具有对每个用户的唯一引用(从逻辑上说,然后是其用户user_id),并具有id在登录时获得当前用户的可能性。

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

1.共享架构

共享架构

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

2.防火墙架构

防火墙架构

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


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

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

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

我更喜欢#1解决方案,但还没有发现很多默认的实现方式可以确保我朝正确的方向前进,因此可以确保我的安全。

我希望我的问题不会被解决。我真的不知道还有什么要问的。

提前致谢


1
您能否将要实现的目标更多细节放在priovide上?在第一种情况下,是否会对Redis或服务本身进行身份验证?第二张图中缺少Redis,这是故意的吗?
Plamen Petrov 2015年

我添加了一些信息。请让我知道仍然不清楚。谢谢!
奥古斯丁·里丁格

您是否在考虑使用OAuth协议创建微服务,而使用您创建的令牌创建其他服务的想法?
TIARE巴尔比

我对这种解决方案感到好奇,但是我仍然不知道它在实践中如何工作。您知道在哪里可以找到它的一些标准实现吗?
奥古斯丁·里丁格

@AugustinRiedinger,感谢您提出来。我还通过采取一些步骤将整体Web应用程序细分为微服务。就您而言,服务1-n是无状态的还是全状态的。如果它们是全状态的,您是否考虑过在每个服务中管理会话。谢谢
曼彻达。P

Answers:


61

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

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

OAuth 2模型

链接微服务设计示例 建筑模型

资源:


1
谢谢,很明显。我发现这非常不错的文章分解几乎是相同的解决方案:dejanglozic.com/2014/10/07/...
奥古斯丁Riedinger

16
您的答案很好,但是从API网关生成的令牌(从令牌网关内部或在AuthMicroService中)如何由随机微服务处理,该微服务的目的是不进行身份验证,并且内部可能没有oauth管理他的商业代码?
mfrachet 2015年

例如,您可以使用Netflix Zuul将网关中收到的令牌发送给所有服务,它们将知道用户信息。docs.spring.io/spring-boot/docs/current/reference/htmlsingle/...
TIARE巴尔比

关于在服务之间使用OAuth2的另一个好处是,您可以拥有区分服务身份验证操作和用户身份验证操作的端点。
cmp

2
OAuth的主要目的是授予系统访问另一个系统中保存的用户数据的权限。在我看来,这对于SAML来说似乎是一个很好的案例。
罗布·格兰特

8

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

  1. 根据ID提供商进行身份验证
  2. 将访问令牌保留在cookie中
  3. 访问webapp中的页面
  4. 致电服务

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

在此处输入图片说明


AWS Lambda不会变得“冷”并花时间启动吗?这会使登录速度变慢,不是吗?
tsuz

@ tsuz,AWS现在在lambda中引入了并发功能,您可以在其中保留并发。这样,您可以解决冷启动问题。docs.aws.amazon.com/lambda/latest/dg/...
桑迪普·奈尔

我很希望在几年前看到这个答案,它令人难以置信地简单地理解了如何编排具有身份验证和授权独立微服务的微服务体系结构以提供对其他服务的访问
brayancastrop

@Sandeep,我认为您指的是预配置并发,而不是保留。
Anil Kumar

0

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

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

您可以在http://proficientblog.com/microservices-security/上找到有关它的更多详细信息。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.