OAuth是一个关于授权的开放网络标准,目前的版本是2.0。通过这个网络标准,一个第三方应用(客户端)可以获取资源所有者(用户)在服务提供商(为用户提供服务的服务商)保存的特定资源。在这个标准中,第三方应用不能直接登录服务提供商,资源所有者只负责做是否授权以及授权哪些资源的决策,根据决策结果,第三方应用可以获得有时效、有授权范围的令牌,并通过令牌从服务供应商那里获得特定的资源。
整片文章分为两部分,这一部分介绍OAuth2的原理。下一篇会介绍一种基于SpringSecurity5的实现方式。
1 OAuth2介绍
1.1 角色(Roles)
1、resource owner---资源所有者,也可以被称为“用户”
2、resource server---资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。
3、client | relying party---第三方应用,希望获得资源所有者数据的服务方,也会被称为“客户端”
4、authorization server | open id provider---认证服务器,负责认证用户的身份,在用户授权之后,会将令牌发送给客户端
1.2 流程(Protocol Flow)
(A)用户在使用客户端,客户端向用户提出要用户授权客户端的请求。
(B)用户首先通过认证服务器的身份认证,然后在认证服务器完成对客户端的授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
1.3 被授权的授权(Authorization Grant)
这里grant是名词的含义,指的是通过用户的授权行为,客户端获得的"能够用来从认证服务器获取令牌(Accees token)"的凭证(Authorization Grant)。有四种方式,在看这四种方式的具体流程之前,最好先看下1.4章,理解token。
1.3.1 授权码模式(Authorization Code)
授权码模式用于获取访问令牌和刷新令牌,并针对机密客户端进行了优化。由于这是基于重定向的流程,客户端必须能够与资源所有者的用户代理(通常是Web浏览器)进行交互,并能够从授权服务器接收传入的请求(通过重定向)。
User-Agent一般指浏览器
(A)用户访问客户端,客户端重定向到认证服务器。
(B)用户通过身份认证,然后决策授权的范围以及时限。
(C)认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
下面三种方式不太常用,这里就不做详细介绍了。
1.3.2 简化模式(Implicit)
1.3.3 密码模式(Resource Owner Password Credentials)
1.3.4 客户端模式(Client Credentials)
1.4 访问令牌(Access Token) & 更新令牌(Refresh Token)
1.4.1 访问令牌
访问令牌是用于访问受保护资源的凭据。访问令牌是发布给客户端的授权的字符串,表示资源所有者对特定范围和持续时间进行的授权,并由资源服务器和授权服务器来保证授权的正确实施。
1.4.2 更新令牌
刷新令牌是用于获取访问令牌的凭据。刷新令牌由授权服务器颁发给客户端,并用于在当前访问令牌变得无效或过期时获取新的访问令牌,或者获得具有相同或更窄范围的附加访问令牌(访问令牌可能具有较短的生命周期和比资源所有者授权的权限更少)。颁发刷新令牌是可选的,由授权服务器自行决定。如果授权服务器发出刷新令牌,则在发出访问令牌时被包括。刷新令牌是表示资源所有者授予客户端的授权的字符串。
授权信息。与访问令牌不同,刷新令牌仅用于授权服务器,并且不会发送到资源服务器。
(A)用户在使用客户端,客户端向用户提出要用户授权客户端的请求。
(B)用户首先通过认证服务器的身份认证,然后在认证服务器完成对客户端的授权。
(C)客户端使用访问令牌,向资源服务器发起请求。
(D)资源服务器返回,被请求的资源。
(E)客户端使用访问令牌,向资源服务器发起请求。
(F)资源服务器发现令牌有问题,返回错误。
(G)客户端使用更新令牌,向授权服务器发起请求,希望获取新的访问令牌。
(H)授权服务器返回新的访问令牌。