協議官網
在傳統的客户端-服務器身份驗證模型中,客户端通過使用資源所有者的憑據向服務器進行身份驗證來請求服務器上的訪問受限資源(受保護資源)。 為了向第三方應用程序提供對受限資源的訪問,資源所有者與第三方共享其憑證。這產生了若干問題和限制。
- 第三方應用程序需要存儲資源所有者的憑據以備將來使用,通常是明文密碼。
- 要求服務器支持密碼認證,儘管密碼存在固有的安全弱點。
- 第三方應用程序獲得對資源所有者受保護資源的過於廣泛的訪問權限,使資源所有者無法限制持續時間或訪問有限的資源子集。
- 資源所有者不能在不撤銷對所有第三方的訪問權限的情況下撤銷對單個第三方的訪問權限,必須通過更改第三方的密碼來實現。
- 任何第三方應用程序的泄露都會導致最終用户的密碼和受該密碼保護的所有數據泄露。
OAuth 通過引入授權層(authorization layer)並將客户端的角色與資源所有者的角色分開來解決這些問題。在 OAuth 中,客户端請求訪問由資源所有者控制並由資源服務器託管的資源,並獲得一組與資源所有者不同的憑據(credentials)。
客户端不是使用資源所有者的憑據來訪問受保護的資源,而是獲取訪問令牌——一個表示特定範圍(scope)、生命週期和其他訪問屬性的字符串。訪問令牌由授權服務器(authorization server)在資源所有者的批准下頒發給第三方客户端。客户端使用訪問令牌訪問由資源服務器託管的受保護資源。
例如,最終用户(資源所有者)可以授予打印服務(客户端)訪問其存儲在照片共享服務(資源服務器)中的受保護照片的權限,而無需與打印服務共享其用户名和密碼。相反,她直接向照片共享服務(授權服務器)信任的服務器進行身份驗證,該服務器頒發打印服務委託特定的憑據(訪問令牌)。
該規範設計用於 HTTP ([RFC2616])。
OAuth 1.0 協議 ([RFC5849]) 作為信息文檔發佈,是小型臨時社區努力的結果。此標準跟蹤規範建立在 OAuth 1.0 部署經驗以及從更廣泛的 IETF 社區收集的其他用例和可擴展性要求的基礎上。
OAuth 2.0 協議不向後兼容 OAuth 1.0。這兩個版本可以在網絡上共存,並且實現可以選擇同時支持這兩個版本。但是,本規範的意圖是新實現支持本文檔中指定的 OAuth 2.0,並且 OAuth 1.0 僅用於支持現有部署。 OAuth 2.0 協議與 OAuth 1.0 協議共享很少的實現細節。熟悉 OAuth 1.0 的實施者應該接近本文檔,不要對其結構和細節做任何假設。
Oauth 裏的四個角色
資源所有者
能夠授予對受保護資源的訪問權限的實體。
當資源所有者是個人時,它被稱為最終用户。
資源服務器
託管受保護資源的服務器,能夠使用訪問令牌接受和響應受保護資源請求。
# 客户 - client
代表資源所有者並經其授權發出受保護資源請求的應用程序。術語“客户端”並不意味着任何特定的實現特徵(例如,應用程序是否在服務器、桌面或其他設備上執行)。
授權服務器(authorization server)
服務器在成功驗證資源所有者並獲得授權後向客户端頒發訪問令牌。
授權服務器和資源服務器之間的交互超出了本規範的範圍。
授權服務器可以是與資源服務器相同的服務器,也可以是單獨的實體。
單個授權服務器可以發佈多個資源服務器接受的訪問令牌。
抽象的 OAuth 2.0 流程描述了四個角色之間的交互,包括以下步驟:
(A) 客户端向資源所有者請求授權。 授權請求可以直接發送給資源所有者,或者最好通過授權服務器作為中介間接發送。
(B) 客户端收到授權確認,這是代表資源所有者授權的憑證,使用本規範中定義的四種授權類型之一或使用擴展授權類型表示。授權授權類型取決於客户端請求授權的方法和授權服務器支持的類型。
(C) 客户端請求訪問令牌,這是通過與授權服務器進行身份驗證來完成。
(D) 授權服務器對客户端進行身份驗證並驗證授權許可,如果有效,則頒發訪問令牌。
(E) 客户端向資源服務器請求受保護的資源,並通過提供訪問令牌進行身份驗證。
(F) 資源服務器驗證訪問令牌,如果有效,則為請求提供服務。
Authorization Grant
授權許可是一種憑證,表示客户端用於獲取訪問令牌的資源所有者授權(訪問其受保護的資源)。 該規範定義了四種授權類型——授權代碼、隱式、資源所有者密碼憑據和客户端憑據——以及用於定義其他類型的可擴展性機制。
Authorization Code
授權碼是通過授權服務器作為客户端和資源所有者之間的中介獲得的。客户端不是直接從資源所有者請求授權,而是將資源所有者引導到授權服務器(通過其在 [RFC2616] 中定義的用户代理),後者又將資源所有者引導迴帶有授權代碼的客户端。
在使用授權碼將資源所有者引導回客户端之前,授權服務器對資源所有者進行身份驗證並獲得授權。由於資源所有者僅通過授權服務器進行身份驗證,因此永遠不會與客户端共享資源所有者的憑據。
授權代碼提供了一些重要的安全優勢,例如能夠對客户端進行身份驗證,以及將訪問令牌直接傳輸到客户端,而無需通過資源所有者的用户代理並可能將其暴露給其他人,包括資源所有者。
Implicit
隱式授權是針對使用 JavaScript 等腳本語言在瀏覽器中實現的客户端進行了優化的簡化授權代碼流。在隱式流程中,不是向客户端發佈授權代碼,而是直接向客户端發佈訪問令牌(作為資源所有者授權的結果)。
授權類型是隱式的,因為沒有頒發中間憑證(例如授權代碼)(稍後用於獲取訪問令牌)。
在隱式授權流程期間發佈訪問令牌時,授權服務器不會對客户端進行身份驗證。在某些情況下,可以通過用於將訪問令牌傳遞給客户端的重定向 URI 來驗證客户端身份。訪問令牌可能會暴露給資源所有者或其他有權訪問資源所有者的用户代理的應用程序。
隱式授權提高了某些客户端(例如作為瀏覽器內應用程序實現的客户端)的響應能力和效率,因為它減少了獲取訪問令牌所需的往返次數。然而,這種便利應該與使用隱式授權的安全隱患進行權衡,尤其是當授權代碼授權類型可用時。
Resource Owner Password Credentials
資源所有者密碼憑據(即用户名和密碼)可以直接用作授權許可來獲取訪問令牌。 僅當資源所有者和客户端之間存在高度信任(例如,客户端是設備操作系統或高特權應用程序的一部分)並且其他授權授予類型不可用時,才應使用憑據( 例如授權碼)。
儘管此授權類型需要客户端直接訪問資源所有者憑據,但資源所有者憑據仍用於單個請求並交換訪問令牌。 通過將憑據與長期訪問令牌或刷新令牌交換,此授權類型可以消除客户端存儲資源所有者憑據以備將來使用的需要。
Client Credentials
當授權範圍僅限於客户端控制下的受保護資源,或先前與授權服務器安排的受保護資源時,客户端憑據(或其他形式的客户端身份驗證)可用作授權許可。 客户端憑據通常用作授權授權,當客户端代表自己行事(客户端也是資源所有者)或根據先前與授權服務器安排的授權請求訪問受保護資源時。
Access Token
訪問令牌是用於訪問受保護資源的憑據。訪問令牌是一個字符串,表示頒發給客户端的授權。該字符串通常對客户端不透明。令牌代表特定的訪問範圍和持續時間,由資源所有者授予,並由資源服務器和授權強制執行
服務器。
令牌可以表示用於檢索授權信息的標識符,或者可以以可驗證的方式自包含授權信息(即,由一些數據和簽名組成的令牌字符串)。為了讓客户端使用令牌,可能需要額外的身份驗證憑據,這超出了本規範的範圍。
訪問令牌提供了一個抽象層,用資源服務器理解的單個令牌替換了不同的授權結構(例如,用户名和密碼)。這種抽象使得頒發訪問令牌比用於獲取它們的授權授予更嚴格,並且消除了資源服務器瞭解各種身份驗證方法的需要。
根據資源服務器的安全要求,訪問令牌可以具有不同的格式、結構和使用方法(例如,加密屬性)。訪問令牌屬性和用於訪問受保護資源的方法超出了本規範的範圍,並由諸如 [RFC6750] 的配套規範定義。
Refresh Token
刷新令牌是用於獲取訪問令牌的憑據。 刷新令牌由授權服務器頒發給客户端,用於在當前訪問令牌失效或過期時獲取新的訪問令牌,或者獲取具有相同或更窄範圍的附加訪問令牌(訪問令牌可能具有較短的生命週期和 比資源所有者授權的權限少)。
頒發刷新令牌是可選的,由授權服務器決定。 如果授權服務器發佈刷新令牌,它會在發佈訪問令牌時包含在內。
刷新令牌是一個字符串,表示資源所有者授予客户端的授權。 該字符串通常對客户端不透明。 令牌表示用於檢索授權信息的標識符。 與訪問令牌不同,刷新令牌僅用於授權服務器,永遠不會發送到資源服務器。
(A) 客户端通過與授權服務器進行身份驗證並提供授權許可來請求訪問令牌。
(B) 授權服務器對客户端進行身份驗證並驗證授權許可,如果有效,則頒發訪問令牌和刷新令牌。
(C) 客户端通過提供訪問令牌向資源服務器發出受保護的資源請求。
(D) 資源服務器驗證訪問令牌,如果有效,則為請求提供服務。
(E) 重複步驟 (C) 和 (D),直到訪問令牌過期。如果客户端知道訪問令牌已過期,則跳到步驟(G);否則,它會發出另一個受保護的資源請求。
(F) 由於訪問令牌無效,資源服務器返回無效令牌錯誤。
(G) 客户端通過與授權服務器進行身份驗證並提供刷新令牌來請求新的訪問令牌。客户端身份驗證要求基於客户端類型和授權服務器策略。
(H) 授權服務器對客户端進行身份驗證並驗證刷新令牌,如果有效,則頒發新的訪問令牌(以及可選的新刷新令牌)。
Refreshing an Access Token
如果授權服務器向客户端發出刷新令牌,則客户端通過使用“application/x-www-form-urlencoded”格式添加以下參數向令牌端點發出刷新請求,其中字符編碼為UTF-8 HTTP 請求實體主體:
- 授予類型:必需。值必須設置為“refresh_token”。
- refresh_token:需要。發給客户端的刷新令牌。
由於刷新令牌通常是用於請求其他訪問令牌的持久憑據,因此刷新令牌綁定到其頒發給的客户端。如果客户端類型是機密的,或者客户端獲得了客户端憑據(或分配了其他身份驗證要求),則客户端必須向授權服務器進行身份驗證。
例如,客户端使用傳輸層安全性發出以下 HTTP 請求(額外的換行符僅用於顯示目的):
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
授權服務器必須:
- 要求對機密客户端或任何已頒發客户端憑據(或具有其他身份驗證要求)的客户端進行客户端身份驗證
- 如果包含客户端身份驗證,則對客户端進行身份驗證,並確保將刷新令牌頒發給經過身份驗證的客户端,以及
- 驗證刷新令牌。
如果有效並獲得授權,授權服務器會發出訪問令牌。 如果請求驗證失敗或無效,授權服務器返回錯誤響應。
授權服務器可能會發出一個新的刷新令牌,在這種情況下,客户端必須丟棄舊的刷新令牌並用新的刷新令牌替換它。 授權服務器可以在向客户端發出新的刷新令牌後撤銷舊的刷新令牌。 如果發佈了新的刷新令牌,則刷新令牌的範圍必須與客户端在請求中包含的刷新令牌的範圍相同。
Security Considerations
Client Authentication
授權服務器與 Web 應用程序客户端建立客户端憑據以進行客户端身份驗證。鼓勵授權服務器考慮比客户端密碼更強的客户端身份驗證方法。 Web 應用程序客户端必須確保客户端密碼和其他客户端憑據的機密性。
授權服務器不得出於客户端身份驗證的目的向本機應用程序或基於用户代理的應用程序客户端發出客户端密碼或其他客户端憑據。授權服務器可以為特定設備上本地應用程序客户端的特定安裝發佈客户端密碼或其他憑據。
當客户端身份驗證不可能時,授權服務器應該採用其他方式來驗證客户端的身份——例如,通過要求註冊客户端重定向 URI 或徵集資源所有者來確認身份。在請求資源所有者授權時,有效的重定向 URI 不足以驗證客户端的身份,但可用於防止在獲得資源所有者授權後將憑據傳遞給偽造的客户端。
授權服務器必須考慮與未經身份驗證的客户端交互的安全隱患,並採取措施限制向此類客户端頒發的其他憑據(例如刷新令牌)的潛在暴露。
Client Impersonation
如果被模擬的客户端未能或無法將其客户端憑據保密,則惡意客户端可以模擬另一個客户端並獲得對受保護資源的訪問權限。
授權服務器必須儘可能對客户端進行身份驗證。如果由於客户端的性質授權服務器無法對客户端進行身份驗證,則授權服務器必須要求註冊任何用於接收授權響應的重定向 URI,並且應該使用其他方法來保護資源所有者免受此類潛在惡意客户端的侵害。例如,授權服務器可以讓資源所有者協助識別客户端及其來源。
授權服務器應該強制執行明確的資源所有者身份驗證並向資源所有者提供有關客户端和請求的授權範圍和生命週期的信息。資源所有者可以在當前客户端的上下文中查看信息並授權或拒絕請求。
授權服務器不應該在沒有驗證客户端或依賴其他措施的情況下自動處理重複的授權請求(沒有主動的資源所有者交互),以確保重複的請求來自原始客户端而不是模仿者。
Access Tokens
訪問令牌憑證(以及任何機密的訪問令牌屬性)必須在傳輸和存儲過程中保密,並且只能在授權服務器、訪問令牌對其有效的資源服務器以及訪問令牌頒發給的客户端之間共享.訪問令牌憑證必須僅使用 TLS 傳輸,並使用 [RFC2818] 定義的服務器身份驗證。
使用隱式授權類型時,訪問令牌在 URI 片段中傳輸,這可能會將其暴露給未授權方。
授權服務器必須確保未授權方無法生成、修改或猜測訪問令牌以生成有效的訪問令牌。
客户端應該請求具有最小必要範圍的訪問令牌。授權服務器應該在選擇如何接受請求的範圍時考慮客户端身份,並且可以發佈權限少於請求的訪問令牌。
本規範沒有為資源服務器提供任何方法來確保授權服務器向該客户端頒發給定客户端提供給它的訪問令牌。
Refresh Tokens
授權服務器可以向 Web 應用程序客户端和本機應用程序客户端發出刷新令牌。
刷新令牌在傳輸和存儲過程中必須保密,並且只能在授權服務器和刷新令牌發給的客户端之間共享。
授權服務器必須維護刷新令牌和它被頒發給的客户端之間的綁定。刷新令牌必須僅使用 TLS 傳輸,並具有 [RFC2818] 定義的服務器身份驗證。
每當可以驗證客户端身份時,授權服務器必須驗證刷新令牌和客户端身份之間的綁定。當無法進行客户端身份驗證時,授權服務器應該部署其他方法來檢測刷新令牌濫用。
例如,授權服務器可以使用刷新令牌輪換,其中每個訪問令牌刷新響應都會發出一個新的刷新令牌。先前的刷新令牌已失效但由授權服務器保留。如果刷新令牌被破壞並隨後被攻擊者和合法客户端使用,其中之一將提供無效的刷新令牌,這將通知授權服務器該漏洞。
授權服務器必須確保未授權方無法生成、修改或猜測刷新令牌以生成有效的刷新令牌。