An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.html
OAuth是Open Authorization(開放受權)的縮寫,容許用戶受權給第三方應用訪問服務提供商所提供的用戶資源,而且保證受權是安全的。web
官網地址json
四種角色:瀏覽器
兩種實體:安全
(A) 用戶打開客戶端,客戶端請求用戶受權服務器
(B) 用戶贊成受權給客戶端app
(C) 客戶端使用獲取的受權,向認證服務器請求令牌url
(D) 認證服務器對客戶端進行認證,並驗證受權,確認有效後發放令牌給客戶端.net
(E) 客戶端使用令牌,向資源服務器請求資源3d
(F) 資源服務器驗證令牌,確認有效後處理請求
客戶端必須獲取用戶的受權,纔可以獲取令牌。OAuth定義了四種獲取受權的方式:
是功能最齊全、流程最嚴謹,也是最經常使用的受權模式。
(A) 用戶經過用戶代理訪問客戶端,客戶端將其重定向到認證服務器
實例:
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
(B) 用戶選擇是否受權給客戶端
(C) 若是用戶受權,認證服務器將用戶重定向到客戶端事先指定的URI,並附加一個受權碼
實例:
HTTP/1.1 302 Found Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA &state=xyz
(D) 客戶端使用受權碼和重定向URI,向認證服務器申請令牌
實例:
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
(E) 認證服務器驗證受權碼和URI,確認無誤後,向客戶端發放令牌
實例:
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) 用戶經過用戶代理訪問客戶端,客戶端將其重定向到認證服務器
實例:
GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 Host: server.example.com
(B) 用戶選擇是否受權給客戶端
(C) 若是用戶受權,認證服務器將用戶重定向到客戶端事先指定的URI,並在URI的Hash部分包含訪問令牌
實例:
HTTP/1.1 302 Found Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA &state=xyz&token_type=example&expires_in=3600
(D) 瀏覽器向資源服務器發送請求,但不包含Hash值
(E) 資源服務器返回一個網頁,包含獲取Hash值中令牌的代碼
(F) 瀏覽器執行腳本,獲取令牌
(G) 瀏覽器將令牌發送給客戶端
用戶必須向客戶端提供用戶名和密碼,存在較大的風險。一般只有在認證服務器沒法經過其餘方式進行受權時,纔會考慮使用此種模式。
(A) 用戶向客戶端提供用戶名和密碼憑證
(B) 客戶端將用戶名和密碼憑證發送給認證服務器,並請求令牌
實例:
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=password&username=johndoe&password=A3ddj3w
(C) 認證服務器確認無誤後,向客戶端發放令牌
由客戶端直接向服務提供商進行認證,其實並不存在受權問題。
(A) 客戶端向認證服務器提供身份憑證,並請求令牌
實例:
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=client_credentials
(B) 認證服務器確認無誤後,向客戶端發放令牌
若是用戶訪問的時候,客戶端所獲取的訪問令牌已通過期,則須要使用刷新令牌從新申請新的訪問令牌。
客戶端發送的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
參考文章:
阮一峯:理解OAuth 2.0