Spring Cloud Security用于构建微服务的安全应用程序和服务,它可以轻松实现微服务系统架构下的统一安全认证与授权。
Spring Cloud Security 有以下组件。
OAuth 2.0是一个标准的授权协议。实际上它是用户资源和第三方应用之间的一个中间层,把资源和第三方应用隔开,使得第三方应用无法直接访问资源,第三方应用要访问资源需要通过提供凭证获得OAuth 2.0授权,从而起到保护资源的作用。
如果智艺安拥有者允许第三方访问资源,则可以将用户名和密码告诉第三方应用,让第三方应用直接以资源所有者的身份进行访问。还可以不提供用户名和密码,而通过授权的方式让第三方应用进行访问。
比如,微信公众号授权提醒就还是OAuth2.0 的一个应用场景。页面弹出一个提示框提示需要获取我们的个人信息。如果我们单击“确认”按钮,则授权第三方应用获取我们在微信公众平台中的个人信息。
在OAuth 2.0 的认证授权过程中,主要涉及以下4种角色。
(1)授权的服务提供方(Authorization Server)。它是安全服务器,进行访问的认证和授权。
(2)资源所有者(Resource Owner)。一般情况下,用户就是资源的所有者,比如用户的头像、照片、名称和手机号等私有数据。
(3)资源服务器(Resource Server)。存在用户资源的服务器。
(4)客户端(Client)。它可以是任何第三方应用,与授权和资源服务提供方无关。在用户授权第三方获取用户私有资源后,第三方通过获取到Token等信息通过授权服务器认证,然后去资源服务器获得资源。
客户端必须得到用户的授权(Authorization Grant)才能获得令牌(Access Token)。OAuth 2.0 定义了4中授权方式。
在密码模式中,用户向客户端提供自己的用户名和密码。客户端使用这些信息向“服务商提供商”申请授权。如下图。
在这种模式中,用户必须把自己的密码给客户端,这就存在安全隐患,不能保证客户端不存储用户密码。所以这种模式通常用在用户对客户端高度信任的情况下,比如客户端是操作系统或者由一个著名公司出品。一般只有在其他授权模式无法执行的情况下,才考虑使用这种模式。
具体运行过程如下:
(1)用户向客户端提供用户名和密码。
(2)客户端将用户名和密码发给安全服务器,向其请求令牌。
客户端发出的HTTP请求中包含一下参数。
(3)安全服务器确认无误后向客户端提供访问令牌。
客户端模式指,客户端以自己的名义向“安全服务器”进行认证。这种模式不存在授权问题。运行过程如下图。
(1)客户端向安全服务器进行身份认证,并申请一个访问令牌。
客户端发出的HTTP请求中包含以下参数。
(2)安全服务器确认无误后向客户端提供访问令牌。
简化模式指,客户端不通过第三方应用程序的服务器,直接在浏览器中向安全服务器申请令牌。所有步骤都在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。运行过程如下图。
(1)客户端通过浏览器将用户导向安全服务器。
客户端发出的HTTP请求包含以下参数。
(2)用户决定是否授权客户端。
(3)如果用户给予授权,则安全服务器将用户导向客户端指定的“重定向URI”,并在该URI的Hash参数值部分包含访问令牌。
安全服务器回应客户端的URI中包含以下参数。
(4)客户端通过浏览器向资源服务器发出请求,其中不包括上一步收到的Hash 值。
(5)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
(6)浏览器执行上一步获得的脚本,提取出令牌。
(7)浏览器将令牌传送给客户端。
在授权码模式中,客户端是通过其后台服务器与安全服务器进行交互的。运行过程如下图。
(1)用户访问客户端。
(2)客户端将用户导向安全服务器。
客户端申请宁认证的URI中包含以下参数。
(3)用户选择是否给客户端授权。
(4)如果用户同意授权,则安全服务器会将用户导向到客户端事先指定的“重定向URI”,并附上一个授权码。
服务器回应客户端的URI中包含以下参数。
(5)客户端收到授权码,附上“重定向URI”,向安全服务器申请令牌。
客户端向安全服务器申请令牌的HTTP请求包含一下参数。
(6)安全服务器核对授权码和重定向URI,确认无误后向客户端发送访问令牌(access_token)和更新令牌(refresh_token)。
安全服务器发送的HTTP回复中包含以下参数。
如果在用户访问时客户端的“访问令牌”已经过期,则用户需要用更新令牌申请一个新的访问令牌。
客户端发出更新令牌的HTTP请求包含以下参数。