对 OAuth2 的理解
OAuth2是一种授权机制,主要用来颁发令牌TOKEN.
首先解释一下各种名词:
- 第三方
- 用户
- 认证服务器
- 资源服务器
假设我想去某网络购物平台买东西,选好想要的物品后到购物车进行结算,届时这个平台会让你选择一个支付方式,假设我选了支付宝,在这里,支付宝就是第三方应用。那么这个平台没有支付宝账号密码它 怎么进行 支付呢?这里就用到了oauth2的授权模式,平台会给支付宝发送一个请求获取授权码,这时会跳转到支付宝界面认证服务器叫用户登录授权。用户操作完成后,支付宝返回一个令牌(TOKEN)给平台,这样平台就可以拿这个令牌去访问你的支付宝钱包资源服务器进行付款。当然支付宝可能不是这样的流程,但是这样已经可以理解OAuth2的工作流程了。
OAuth2 的四种授权方式(authorization grant) 参考 RFC 6749 文件,以适应各种互联网场景
- 授权码(authorization code)
- 授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。
- 隐藏式(implicit)
- 有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)”隐藏式”(implicit)。
- 密码式(password)
- 如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为”密码式”(password)。
- 客户端凭证 (client credentials)
- 最后一种方式是凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌。
不管哪一种授权方式,第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。
网站拿到令牌后,就可以向第三方资源服务器API去请求数据了。每个发到API的请求,都必须带有令牌。在请求头信息里加上一个Authorization字段,令牌 放在这个字段里面。
1 | curl -H "Authorization: Bearer ACCESS_TOKEN" \ |
更新令牌
如果令牌有效期到了,在 走一遍上面的流程再申请令牌,比较麻烦。OAuth 2.0 允许用户自动更新令牌。
具体方法,颁发令牌时,一次性颁发两个令牌,一个用户获取数据,另一个用于更新令牌(refresh token)。令牌到期前 ,用户使用 refresh token发送一个请求 ,去更新令牌。 grant_type参数为refresh token 表示要求更新令牌 。
- 本文作者: MISAKIGA
- 本文链接: https://misakiga.github.io/2020/02/29/notes/OAuth2的理解/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
