微服务认证策略
Microservice Authentication strategy
我很难为微服务架构选择 decent/secure 身份验证策略。我在该主题上找到的唯一 SO post 是这个:Single Sign-On in 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 存储等),但有很多可能性。唯一重要的是服务 X 永远不需要对用户进行身份验证。
这两个解决方案在以下方面如何比较:
- 安全
- 稳健性
- 可扩展性
- 易用性
或者您可能会建议我在这里没有提到的另一种解决方案?
我更喜欢解决方案 #1,但没有找到太多默认实现来确保我朝着正确的方向前进。
根据我的理解,解决它的一个好方法是使用 OAuth 2 协议 (您可以在 http://oauth.net/2/ 上找到更多相关信息)
当您的用户登录到您的应用程序时,他们将获得一个令牌,使用此令牌,他们将能够发送到其他服务以在请求中识别他们。
链式微服务设计示例
资源:
您可以使用 idenitty server 4 进行身份验证和授权
您必须使用防火墙架构,因此您可以更好地控制安全性、稳健性、可扩展性和易用性
简答:使用 Oauth2.0 类基于令牌的身份验证,它可以用于任何类型的应用程序,如网络应用程序或移动应用程序。 Web 应用程序所涉及的步骤顺序是
- 针对 ID 提供商进行身份验证
- 将访问令牌保存在 cookie 中
- 访问 webapp 中的页面
- 调用服务
下图描述了所需的组件。这种将 web 和数据 api 分开的架构将提供良好的可扩展性、弹性和稳定性
您可以使用 JWT 个令牌避免在后端存储会话信息。
这是使用 OAuth 2.0 & OpenID Connect 的样子。我还将用户名和密码登录添加到答案中,因为我假设大多数人也将其添加为登录选项。
以下是解决方案的建议组件:
Account-service: 一个负责用户创建和身份验证的微服务。可以有 Google、Facebook and/or 常规用户名和密码身份验证端点的端点 - 登录、注册。
在注册时——意思是通过注册端点或第一次 google/fb 登录,我们可以在数据库中存储有关用户的信息。
在用户使用任一选项成功登录后,我们在服务器端创建一个包含相关用户数据(如 userID)的 JWT 令牌。为了避免篡改,我们使用我们定义的令牌秘密(这是一个字符串)对其进行签名。
此令牌应作为 httpOnly cookie 与登录响应一起返回。为了安全起见,建议也只使用 https。关于 OpenID 连接规范,此令牌将是 ID 令牌。
客户端 Web 应用程序: 将签名的 JWT 作为 httpOnly cookie 接收,这意味着 javascript 代码无法访问此数据,并且是从安全角度推荐。当向服务器或其他微服务发送后续请求时,我们将 cookie 附加到请求中(在 axios 中这意味着使用 withCredentials: true)。
需要通过令牌对用户进行身份验证的微服务:
这些服务验证 JWT 令牌的签名,并使用提供给令牌签名的相同秘密读取它。然后他们可以访问存储在令牌上的数据,例如用户 ID,并获取数据库以获取有关用户的其他信息,或者执行任何其他逻辑。注意 - 这不是用作授权,而是用于身份验证。为此,我们有刷新令牌和访问令牌,这超出了问题的范围。
我最近创建了一个专门关于这个主题的详细指南,以防对某人有所帮助:https://www.aspecto.io/blog/microservices-authentication-strategies-theory-to-practice/
我很难为微服务架构选择 decent/secure 身份验证策略。我在该主题上找到的唯一 SO post 是这个:Single Sign-On in 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 存储等),但有很多可能性。唯一重要的是服务 X 永远不需要对用户进行身份验证。
这两个解决方案在以下方面如何比较:
- 安全
- 稳健性
- 可扩展性
- 易用性
或者您可能会建议我在这里没有提到的另一种解决方案?
我更喜欢解决方案 #1,但没有找到太多默认实现来确保我朝着正确的方向前进。
根据我的理解,解决它的一个好方法是使用 OAuth 2 协议 (您可以在 http://oauth.net/2/ 上找到更多相关信息)
当您的用户登录到您的应用程序时,他们将获得一个令牌,使用此令牌,他们将能够发送到其他服务以在请求中识别他们。
链式微服务设计示例
资源:
您可以使用 idenitty server 4 进行身份验证和授权
您必须使用防火墙架构,因此您可以更好地控制安全性、稳健性、可扩展性和易用性
简答:使用 Oauth2.0 类基于令牌的身份验证,它可以用于任何类型的应用程序,如网络应用程序或移动应用程序。 Web 应用程序所涉及的步骤顺序是
- 针对 ID 提供商进行身份验证
- 将访问令牌保存在 cookie 中
- 访问 webapp 中的页面
- 调用服务
下图描述了所需的组件。这种将 web 和数据 api 分开的架构将提供良好的可扩展性、弹性和稳定性
您可以使用 JWT 个令牌避免在后端存储会话信息。
这是使用 OAuth 2.0 & OpenID Connect 的样子。我还将用户名和密码登录添加到答案中,因为我假设大多数人也将其添加为登录选项。
Account-service: 一个负责用户创建和身份验证的微服务。可以有 Google、Facebook and/or 常规用户名和密码身份验证端点的端点 - 登录、注册。 在注册时——意思是通过注册端点或第一次 google/fb 登录,我们可以在数据库中存储有关用户的信息。 在用户使用任一选项成功登录后,我们在服务器端创建一个包含相关用户数据(如 userID)的 JWT 令牌。为了避免篡改,我们使用我们定义的令牌秘密(这是一个字符串)对其进行签名。 此令牌应作为 httpOnly cookie 与登录响应一起返回。为了安全起见,建议也只使用 https。关于 OpenID 连接规范,此令牌将是 ID 令牌。
客户端 Web 应用程序: 将签名的 JWT 作为 httpOnly cookie 接收,这意味着 javascript 代码无法访问此数据,并且是从安全角度推荐。当向服务器或其他微服务发送后续请求时,我们将 cookie 附加到请求中(在 axios 中这意味着使用 withCredentials: true)。
需要通过令牌对用户进行身份验证的微服务: 这些服务验证 JWT 令牌的签名,并使用提供给令牌签名的相同秘密读取它。然后他们可以访问存储在令牌上的数据,例如用户 ID,并获取数据库以获取有关用户的其他信息,或者执行任何其他逻辑。注意 - 这不是用作授权,而是用于身份验证。为此,我们有刷新令牌和访问令牌,这超出了问题的范围。
我最近创建了一个专门关于这个主题的详细指南,以防对某人有所帮助:https://www.aspecto.io/blog/microservices-authentication-strategies-theory-to-practice/