OAuth2
OAuth2 简介
- OAuth 协议的目的是为用户资源的授权提供一个安全、开放而简易的标准。由于 OAuth2不兼容 OAuth1,且签名逻辑过于复杂和授权流程过于单一。
- OAuth2 是当前授权的标准,其重点在于为 Web应用程序、桌面应用程序、移动设备以及室内设备的授权流程提供简单的客户端开发方式。它为第三方应用提供对 HTTP服务的有限访问,既科室是资源拥有者通过授权允许第三方应用获取 HTTP服务,也可以是第三方以自己的名义获取访问权限。
1. 角色
- OAuth2 中主要分为了4中角色
Resource Owner
(资源所有者),是能够受保护的资源授予访问权限的实体,可以是一个用户,称为终端用户(end-user)。Resource Server
(资源服务器),持有受保护的资源,允许持有访问令牌(Access Token)的请求访问受保护资源。Client
(客户端),持有资源所有者的授权,代表资源所有者对受保护资源进行访问。Authorization Server
(授权服务器),对资源所有者的授权进行认证,成功后向客户端发送访问令牌。
- 在很多时候,资源服务器和授权服务器是合二为一的,在授权交互的时候作为授权服务器,在请求资源交互时作为资源服务器。授权服务器也可以是单独的实体,它可以发出由多个资源服务器接收的访问令牌。
2. 协议流程
- 客户端请求资源所有者的授权。
- 资源所有者同意授权,返回授权许可证(Authorization Grant),这代表了资源所有者的授权凭证。
- 客户端携带授权许可要求授权服务器进行认证,请求访问令牌。
- 授权服务器对客户端进行身份认证,并认证授权许可,如果有效,返回访问令牌。
- 客户端携带访问令牌向资源服务器请求受保护资源的访问。
- 资源服务器验证访问令牌,如果有效,接收访问的请求,返回受保护资源。
3. 客户端授权类型
-
为了获取访问令牌,客户端必须获取到资源所有者的授权许可。OAuth2 默认定义了四中授权类型,当然也提供了用于定义额外授权类型的扩展机制。默认的四种授权类型为:
Authorization Code
(授权码类型)Implicit
(简化裂隙,也成为隐式类型)Reshource Owner Password Credentials
(密码类型)Client Credential
(客户端类型)
-
授权码类型通过重定向的方式让资源所有和直接与授权服务器进行交互,通过这种方式授权,避免了资源所有者的信息泄露给客户端,是功能最完整、流程最严密的授权类型,但是需要客户端必须能与资源所有者的代理(通常是 Web浏览器)进行交互,并且可从授权服务器中接收请求(重定向给予授权码),
- 客户端引导资源所有者的用户代理到授权服务器的端点(endpoint),一般通过重定向的方式。客户端提交的信息应包含客户端标识(Client Identifier)、请求范围(Requested Scope)、本地状态(Local State)和用于返回授权码的重定向地址(Redirection URI)。
- 授权服务器认证资源所有者(通过用户代理),并确认资源所有者允许还是拒绝客户端的访问请求。
- 如果资源所有者授予客户端访问权限,授权服务器通过重定向向用户代理的方式回调客户端提供的重定向地址,并在重定向地址中添加授权码和客户端向前提供的任何本地状态。
- 客户端携带上一步获得的授权码向授权服务器请求访问令牌。在这一步中授权码和客户端都要由授权服务器进行认证。 客户需要提交用户获取授权码的重定向地址。
- 授权服务器对客户端进行身份验证,和授权码验证,确保收到重定向地址与第三步中用于获取授权码的重定向地址相匹配。如果有效,返回访问令牌,以及可选刷新令牌(Refresh Token)。
-
密码类型需要资源所有者将密码品凭证交予客户端,客户端通过自己持有的信息直接向授权服务器获取授权。在这种情况下,需要资源所有者对客户端高度信任,同时客户端不允许保存密码凭证。这种授权类型适用于能够获取资源所有者的凭证(Credentials,如用户名和密码)的客户端。
- 资源所有者向客户端提供其用户名和密码凭证。
- 客户端携带资源所有者的凭证(用户名和密码),向授权服务器请求访问令牌。
- 授权服务器认证客户端并且验证资源所有者的凭证,如果有效,则返回访问令牌,以及可选的刷新令牌。
4. 令牌刷新
- 客户端从授权服务器中获取的访问令牌(Acess Token)一般是具备时效性的。在访问令牌过期的情况下,持有有效用户凭证的客户端可以再次向授权服务器请求访问令牌。但是未持有用户凭证的客户端也可以通过和上一次访问令牌一同返回的刷新令牌和向授权服务器请求新的访问令牌。