Oauth2.0 學(xué)習(xí)筆記

一、什么是Oauth2.0

什么是Oauth?官方答案如下:

An?open protocol?to allow?secure authorization?in a?simple?and?standard?method from web, mobile and desktop applications.


Oauth 2.0是目前Oauth的最新版本。

OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices.?

以上內(nèi)容來自:https://oauth.net/2/

百度百科解釋如下:

OAUTH協(xié)議為用戶資源的授權(quán)提供了一個安全的、開放而又簡易的標(biāo)準(zhǔn)。與以往的授權(quán)方式不同之處是OAUTH的授權(quán)不會使第三方觸及到用戶的帳號信息(如用戶名與密碼),即第三方無需使用用戶的用戶名與密碼就可以申請獲得該用戶資源的授權(quán),因此OAUTH是安全的。oAuth是Open Authorization的簡寫。

阮一峰的解釋:

簡單說,OAuth 就是一種授權(quán)機(jī)制。數(shù)據(jù)的所有者告訴系統(tǒng),同意授權(quán)第三方應(yīng)用進(jìn)入系統(tǒng),獲取這些數(shù)據(jù)。系統(tǒng)從而產(chǎn)生一個短期的進(jìn)入令牌(token),用來代替密碼,供第三方應(yīng)用使用。

來自:http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

二、Oauth2.0授權(quán)方式

RFC 6749?文件(OAuth 2.0 的標(biāo)準(zhǔn))寫到:OAuth 引入了一個授權(quán)層,用來分離兩種不同的角色:客戶端和資源所有者。......資源所有者同意以后,資源服務(wù)器可以向客戶端頒發(fā)令牌??蛻舳送ㄟ^令牌,去請求數(shù)據(jù)。(由于互聯(lián)網(wǎng)有多種場景,)本標(biāo)準(zhǔn)定義了獲得令牌的四種授權(quán)方式(authorization grant )。

OAuth 2.0的運(yùn)行流程如下圖,摘自RFC 6749。

OAuth 2.0 規(guī)定了四種獲得令牌的流程。你可以選擇最適合自己的那一種,向第三方應(yīng)用頒發(fā)令牌。

下面就是這四種授權(quán)方式。

授權(quán)碼(authorization-code)

隱藏式(implicit)

密碼式(password)

客戶端憑證(client credentials)

不管哪一種授權(quán)方式,第三方應(yīng)用申請令牌之前,都必須先到系統(tǒng)備案,說明自己的身份,然后會拿到兩個身份識別碼:客戶端 ID(client ID)和客戶端密鑰(client secret)。這是為了防止令牌被濫用,沒有備案過的第三方應(yīng)用,是不會拿到令牌的。

在互聯(lián)網(wǎng)場景中,最流行是授權(quán)碼模式,也是最安全的授權(quán)方式。授權(quán)碼模式(authorization code)是功能最完整、流程最嚴(yán)密的授權(quán)模式。

三、授權(quán)碼模式流程


另一個示意圖:


1. 請求授權(quán)碼。

客戶端通過使用“application/x-www-form- urlencoding”格式向授權(quán)端點(diǎn)URI的查詢組件添加以下參數(shù)來構(gòu)造請求URI

response_type:必須的。值必須是"code"。

client_id:必須的??蛻舳藰?biāo)識符。

redirect_uri:可選的。

scope:可選的。請求訪問的范圍。

state:推薦的。一個不透明的值用于維護(hù)請求和回調(diào)之間的狀態(tài)。授權(quán)服務(wù)器在將用戶代理重定向會客戶端的時(shí)候會帶上該參數(shù)。

例如:

GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1

Host: server.example.com

2.返回授權(quán)碼

如果資源所有者授權(quán)訪問請求,授權(quán)服務(wù)器發(fā)出授權(quán)代碼并通過使用“application/x-www-form- urlencoding”格式向重定向URI的查詢組件添加以下參數(shù),將其給客戶端。

code:必須的。授權(quán)服務(wù)器生成的授權(quán)碼。授權(quán)代碼必須在發(fā)布后不久過期,以減少泄漏的風(fēng)險(xiǎn)。建議最大授權(quán)代碼生命期為10分鐘??蛻舳瞬坏枚啻问褂檬跈?quán)代碼。如果授權(quán)代碼不止一次使用,授權(quán)服務(wù)器必須拒絕請求,并在可能的情況下撤銷先前基于該授權(quán)代碼發(fā)布的所有令牌。授權(quán)代碼是綁定到客戶端標(biāo)識符和重定向URI上的。

state:如果之前客戶端授權(quán)請求中帶的有"state"參數(shù),則響應(yīng)的時(shí)候也會帶上該參數(shù)。

例如:

HTTP/1.1 302 Found

  Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

3.請求令牌

客戶端通過使用“application/ www-form-urlencoding”格式發(fā)送以下參數(shù)向令牌端點(diǎn)發(fā)出請求

grant_type:必須的。值必須是"authorization_code"。

code:必須的。值是從授權(quán)服務(wù)器那里接收的授權(quán)碼。

redirect_uri:如果在授權(quán)請求的時(shí)候包含"redirect_uri"參數(shù),那么這里也需要包含"redirect_uri"參數(shù)。而且,這兩處的"redirect_uri"必須完全相同。

client_id:如果客戶端不需要認(rèn)證,那么必須帶的該參數(shù)。

例如:

POST /token HTTP/1.1

  Host: server.example.com

  Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

  Content-Type: application/x-www-form-urlencoded

  grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

4.返回令牌

Access Token Response

例如:

  HTTP/1.1 200 OK

  Content-Type: application/json;charset=UTF-8

  Cache-Control: no-store

  Pragma: no-cache

  {

    "access_token":"2YotnFZFEjr1zCsicMWpAA",

    "token_type":"example",

    "expires_in":3600,

    "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",

    "example_parameter":"example_value"

  }

四、令牌的使用

A 網(wǎng)站拿到令牌以后,就可以向 B 網(wǎng)站的 API 請求數(shù)據(jù)了。

此時(shí),每個發(fā)到 API 的請求,都必須帶有令牌。具體做法是在請求的頭信息,加上一個Authorization字段,令牌就放在這個字段里面。

刷新令牌

令牌的有效期到了,如果讓用戶重新走一遍上面的流程,再申請一個新的令牌,很可能體驗(yàn)不好,而且也沒有必要。OAuth 2.0 允許用戶自動更新令牌。

具體方法是,B 網(wǎng)站頒發(fā)令牌的時(shí)候,一次性頒發(fā)兩個令牌,一個用于獲取數(shù)據(jù),另一個用于獲取新的令牌(refresh token 字段)。令牌到期前,用戶使用 refresh token 發(fā)一個請求,去更新令牌。如:

https://b.com/oauth/token?

? grant_type=refresh_token&

? client_id=CLIENT_ID&

? client_secret=CLIENT_SECRET&

? refresh_token=REFRESH_TOKEN

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容