OAuth2.0
OAuth2.0
- 1. 什么是OAuth2.0
- 2.OAuth2.0的应用场景
- 3. OAuth2.0基本概念
- 4. 经典OAuth2.0认证流程
- 5. 四种授权模式
- 5.1 授权码模式(Authorization Code Grant)
- 5.2 隐式授权(Implicit Grant)
- 5.3 密码模式(Resource Owner Password Credentials Grant)
- 5.4 客户端授权模式(Client Credentials Grant)
- 6. 令牌的使用和更新
- 6.1 令牌的使用
- 6.2 令牌的更新
- 9. 实际生产中举例
- 10. 总结
1. 什么是OAuth2.0
OAuth全称为Open Authorization(开放授权)。OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的。
一句话理解:OAuth 2.0 就像是用户委托给第三方应用的一把“钥匙”,允许它在限定范围内访问用户的资源,比如读取用户的邮箱、获取社交信息等。
2.OAuth2.0的应用场景
想象一下这个场景,当你在某个网站上冲浪时,看到一篇文章很有意思,想在文章下面评论,但这时网站弹出提示框告诉你要登录之后才能评论,登录方式可以选择微信或QQ,这时你就可以通过扫码登录,登录完成之后便会以你的社交帐号信息来进行评论等操作。
3. OAuth2.0基本概念
- 客户端(Client):请求访问资源的第三方应用;客户端可以是Web站点、App、设备等。
- 服务提供商(Service Provider):服务提供商是指提供、存放资源的网络服务,如Google、Github等;
- 资源所有者(Resource Owner):资源所有者通常就是指用户,他们拥有服务提供商上的资源。
- 授权服务器(Authorization Server):授权服务器是服务提供商用于处理和发放访问令牌的服务器。当用户请求访问资源时,需要先向授权服务器请求访问令牌。
- 资源服务器(Resource Server):资源服务器是服务提供商用于存储和管理资源的服务器;当用户拥有访问令牌后,就可以向资源服务器请求访问资源。
- 访问令牌(Access Token):访问令牌是授权服务器发放给客户端的一个凭证,表示客户端有权访问资源所有者的资源。访问令牌有一定的有效期,过期后需要使用刷新令牌来获取新的访问令牌。
- 刷新令牌(Refresh Token):刷新令牌是授权服务器在发放访问令牌时一同发放的一个凭证,用于在访问令牌过期后获取新的访问令牌。刷新令牌通常有较长的有效期,甚至可以设置为永不过期。
- 用户代理(User Agent):通常指浏览器。
4. 经典OAuth2.0认证流程
5. 四种授权模式
5.1 授权码模式(Authorization Code Grant)
用户在使用网站时,可能会选择通过第三方服务,如QQ,进行登录。这种情况下,他们允许网站获取一些个人信息,例如昵称和头像。简化的过程如下:
(1).授权请求:用户选择QQ登录后,网站向QQ的授权服务器发出请求,以期获得用户信息的访问权限。
(2).用户验证:QQ服务器会要求用户登录并确认是否同意网站获取其个人信息。
(3).授权码获取:用户同意后,QQ服务器生成一个授权码,并将其发送回请求的网站。
(4).访问令牌交换:网站使用授权码,结合其在QQ平台注册时获得的client_id和client_secret,向QQ服务器交换Access Token和Refresh Token,授权码随即作废。
(5).资源访问:最后,网站利用Access Token向QQ的资源服务器请求用户的特定信息。资源服务器在验证Access Token有效后,将信息提供给网站。通过这种方式,用户可以安全地授权网站访问其在第三方平台的个人信息。
5.2 隐式授权(Implicit Grant)
隐式授权又称简化授权模式,它和授权码模式类似,只不过少了获取授权码的步骤,是直接获取令牌token的,且没有Refresh Token,适用于公开的浏览器单页应用。因为令牌直接从授权服务器返回,所以没有安全保证,令牌容易因为被拦截窃听而泄露。
5.3 密码模式(Resource Owner Password Credentials Grant)
如果你高度信任某个应用,允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码模式"。
首先资源所有者(用户)提供自己的用户名和密码给客户端(Client),然后客户端(Client)携带从用户那里获取的凭证去授权服务器请求Token, 授权服务器对客户端进行身份认证,并校验资源所有者的凭证,如果都校验通过,则发放Token。
适用范围:只适用于应用是受信任的场景。一个典型的例子是同一个企业内部的不同产品要使用本企业的 Oauth2.0 体系。在这种情况下,由于是同个企业,不需要向用户展示“xxx将获取以下权限”等字样并询问用户的授权意向,而只需进行用户的身份认证即可。这个时候,只需要用户输入凭证并直接传递给鉴权服务器进行授权即可。
5.4 客户端授权模式(Client Credentials Grant)
客户端(Client)通过Client_id和Client_secret去授权服务器请求Token,授权服务器认证Client_id和Client_secret是否正确,若正确则发放Token给客户端(Client)。最后客户端通过AccessToken请求资源。
6. 令牌的使用和更新
6.1 令牌的使用
令牌的使用客户端拿到访问令牌后就可以通过web API向服务提供商的资源服务器请求资源了。此时,每个发到 API 的请求,都必须带有令牌。具体做法是在请求的头信息,加上一个Authorization字段,令牌就放在这个字段里面。
curl -H "Authorization: Bearer ACCESS_TOKEN" \
"https://example.com"
6.2 令牌的更新
令牌的有效期到了,如果让用户重新走一遍上面的流程,再申请一个新的令牌,很可能体验不好,而且也没有必要。OAuth 2.0 允许用户自动更新令牌。具体方法是,服务提供商平台颁发令牌的时候,一次性颁发两个令牌,一个用于获取数据的access_token,另一个用于获取新的令牌refresh_token。令牌到期前,用户使用 refresh_token 发一个请求,去更新令牌。
https://server.example.com/oauth/token?
grant_type=refresh_token&client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN
参数解释:
- grant_type: 参数为refresh_token表示要求更新令牌;
- client_id:客户端id,第三方应用在服务提供者平台注册的,用于身份认证;
- client_secret:授权服务器的秘钥,第三方应用在服务提供者平台注册的,用于身份认证;
- refresh_token: 参数就是用于更新令牌的令牌
9. 实际生产中举例
这里我们的服务就是,从一个统一的页面登录,这个页面有N多个服务业务,然后点击某个服务,会把跳到这个地址并会带一个code (Authorization Code),比如 https://www.qq.com/index.html?code=123456这种,然后前端第一次进入这个页面把code传递给后端接口,从而获取到 访问令牌(Access Token),当然这个Access Token是有过期时间的。还有要注意这个code是一次性的。
10. 总结
总的来说OAuth就是一种授权机制,数据的所有者告诉系统,统一授权第三方应用进入系统,获取部分数据。系统产生短期有实效和权限范围的令牌(token)给第三方应用,用来代替密码,供第三方使用。OAuth2.0授权的核心就是颁发访问令牌、使用访问令牌。也可以认为OAuth2.0是一个安全协议,按照OAuth2.0的规范来实施,就可以用来保护互联网中受保护资源。