OAuth授权码的学习总结

OAuth 2.0 规定了四种获得令牌的流程。

  • 授权码(authorization-code)
  • 隐藏式(implicit)
  • 密码式(password)
  • 客户端凭证(client credentials)

第一种授权方式:授权码

  • 应用场景:有后端的 Web 应用。

  • 好处:这种方式是最常用的流程,安全性也最高,授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

场景演示

  • 第一步:小明在A网站点击“用户授权”,网站就会跳到B网站进行要求用户是否同意授权

下面就是 A 网站跳转 B 网站的一个示意链接

https://b.com/oauth/authorize?
  response_type=code& //表示要求返回授权码
  client_id=CLIENT_ID& //让 B 知道是谁在请求
  redirect_uri=CALLBACK_URL& // B 接受或拒绝请求后的跳转网址
  scope=read//表示要求的授权范围(这里是只读)。

  • 第二步:小明表示同意,这时 B 网站就会跳回redirect_uri参数指定的网址。跳转时,会传回一个授权码,就像下面这样。
https://a.com/callback?code=AUTHORIZATION_CODE

上面 URL 中,code参数就是授权码

  • 第三步,A 网站拿到授权码以后,就可以在后端,向 B 网站请求令牌。
https://b.com/oauth/token?
 client_id=CLIENT_ID&
 client_secret=CLIENT_SECRET&
 grant_type=authorization_code&
 code=AUTHORIZATION_CODE&
 redirect_uri=CALLBACK_URL
 
  • 第四步,B 网站收到请求以后,就会颁发令牌。具体做法是向redirect_uri指定的网址,发送一段 JSON 数据。
{    
  "access_token":"ACCESS_TOKEN",
  "token_type":"bearer",
  "expires_in":2592000,
  "refresh_token":"REFRESH_TOKEN",
  "scope":"read",
  "uid":100101,
  "info":{...}
}

上面 JSON 数据中,access_token字段就是令牌,A 网站在后端拿到了。

第二种方式:隐藏式

  • 应用场景: Web 应用是纯前端应用,没有后端。

  • 好处:允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)“隐藏式”(implicit)。

运行方式

  • 第一步:小明在A网站点击"用户授权" 后还是跳转到B网站,但是传递的参数不一样

https://b.com/oauth/authorize?
  response_type=token&  //表示要求直接返回令牌
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read
  
  • 第二步:小明从B网站同意授权后回到A网站
https://a.com/callback#token=ACCESS_TOKEN

注意,令牌的位置是URL锚点(fragment),而不是查询字符串(querystring),这是因为 OAuth 2.0 允许跳转网址是HTTP协议,因此存在"中间人攻击"的风险,而浏览器跳转时,锚点不会发到服务器,就减少了泄漏令牌的风险。

第三种方式:密码式

  • 应用场景:你高度信任某个应用

  • 好处:只适用于其他授权方式都无法采用的情况

运行方式

- 第一步:A网站要求小明输入账号密码。拿到以后,A网站向B网站请求令牌

https://oauth.b.com/token?
  grant_type=password& //表示"密码式"
  username=USERNAME&
  password=PASSWORD& //B 的用户名和密码。
  client_id=CLIENT_ID
  
  • 第二步,B 网站验证身份通过后,直接给出令牌。注意 ,这时不需要跳转,而是把令牌放在 JSON 数据里面,作为 HTTP 回应,A 因此拿到令牌。

第四种方式:凭证式

  • 应用场景:适用于没有前端的命令行应用

  • 好处:这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。

运行方式

  • 第一步,A 应用在命令行向 B 发出请求。
https://oauth.b.com/token?
  grant_type=client_credentials&//表示采用凭证式
  client_id=CLIENT_ID&//用来让 B 确认 A 的身份。
  client_secret=CLIENT_SECRET
  
  • 第二步,B 网站验证通过以后,直接返回令牌。

你可能感兴趣的:(OAuth授权码的学习总结)