使用Oauth2实现微服务的安全保护

序言安全性是暴露由许多微服务组成的公共访问API时要考虑的最重要的一个方面 。Spring有一些有趣的功能和框架,使我们的微服务安全配置更容易 。在本文中,我将向您展示如何使用Spring Cloud和Oauth2在API网关后面提供令牌访问安全性 。
理论知识OAuth2标准目前被所有主要网站使用并且允许通过共享API访问其资源 。它是一种开放式授权标准,允许用户将存储在一个页面中的私有资源共享到另一个页面,而无需进入其凭据服务 。这些是与oauth2相关的基本术语 。

  • Resource Owner – 处理对资源的访问
  • Resource Server – 存储可以使用特殊令牌共享的所有者资源的服务器
  • Authorization Server – 管理密钥,令牌和其他临时资源访问代码的分配 。它还必须确保授予相关人员访问权限
  • Access Token – 允许访问资源的密钥
  • Authorization Grant – 授予访问权限 。有多种方法可以确认访问权限:授权代码,隐式,资源所有者密码凭据和客户端凭据
您可以在此处以及在digitalocean文章中阅读有关此标准的更多信息 。该协议的流程主要有三个步骤 。首先,我们将授权请求发送给资源所有者 。在资源所有者响应后,我们向授权服务器发送授权请求并接收访问令牌 。最后,我们将此访问令牌发送到资源服务器,如果它有效,则API将资源提供给应用程序 。
方案下图显示了我们案例的架构 。我们用API网关(Zuul)代理我们对授权服务器的请求和两个帐户微服务实例 。授权服务器是某种提供outh2安全机制的基础结构服务 。我们还有发现服务(Eureka),我们所有的微服务都已注册 。
使用Oauth2实现微服务的安全保护

文章插图
 
网关对于我们的示例,我们不会在API网关上提供任何安全性 。它只需要将客户端的请求代理到授权服务器和帐户微服务 。在下面可见的Zuul的网关配置中,我们将sensitiveHeaders属性设为空值以启用授权HTTP头转发 。默认情况下,Zuul在将我们的请求转发到目标API时切断了该头,这是不正确的,因为网关后面的服务需要基本授权 。
使用Oauth2实现微服务的安全保护

文章插图
 
网关源代码中的主类非常简单 。它只需要启用Zuul代理功能和发现客户端来收集Eureka注册表中的服务 。
使用Oauth2实现微服务的安全保护

文章插图
 
授权服务器gaOur授权服务器内的主类也很简单 。它基于默认的Spring安全配置 。客户端授权详细信息存储在内存存储库中 。当然在生产模式中,您也可以使用其他实现而不是内存存储库,如JDBC数据源和令牌存储 。您可以在Spring Security Reference和Spring Boot Security中阅读有关Spring授权机制的更多信息 。这是Application.yml的配置片段 。我们为/ token端点提供了用户基本身份验证数据和基本安全凭证:client-id和client-secret 。用户凭据是普通的Spring Security用户详细信息 。
使用Oauth2实现微服务的安全保护

文章插图
 
这是用@EnableAuthorizationServer实现身份验证服务器的主要类 。我们公开一个REST端点验证帐户服务的用户身份详情,并为客户端启用了Eureka注册和发现 。
使用Oauth2实现微服务的安全保护

文章插图
 
Application-账户微服务我们的示例微服务只有一个@GET请求的端点,它始终返回相同的帐户 。在主类中,资源服务和Eureka发现都已启用 。服务配置很简单 。GitHub上提供了示例应用程序源代码 。
使用Oauth2实现微服务的安全保护

文章插图
 
测试我们只需要Web浏览器和REST客户端(例如Chrome Advanced REST客户端)来测试我们的解决方案 。从向资源所有者发送授权请求开始测试 。我们可以通过Web浏览器中的Zuul网关调用oauth2授权端点 。
http://localhost:8765/uaa/oauth/authorize?response_type=token&client_id=acme&redirect_uri=http://example.com&scope=openid&state=48532
发送请求后,我们应该看到下面的页面 。选择“Approve”,然后单击“Authorize”,从授权服务器请求访问令牌 。如果应用程序标识已通过身份验证且授权授予有效,则应在HTTP响应中返回应用程序的访问标记 。
使用Oauth2实现微服务的安全保护

文章插图
 
http://example.com/#access_token=b1acaa35-1ebd-4995-987d-56ee1c0619e5&token_type=bearer&state=48532&expires_in=43199


推荐阅读