體會OAuth2.0的設計理念
Baidu 云平臺采用OAuth2.0 開放授權標準,第三方應用無需獲取用戶的賬號和密碼即可訪問用戶在服務端存儲的私有數據。其中較為常用的是Authorization Code 授權模式。在實際開發Baidu 云平臺應用的過程中,可以體會到OAuth2.0 的設計理念。
首先需要創建一個應用。在服務端看來,應用是發出API調用的主體,無論具體是從哪個進程哪個IP發出API調用,只要是以同一個應用的名義發出,服務端就不區別對待。具體來講,一個應用的身份驗證信息包括一組client_id和client_secret,相當于這個應用作為一個用戶的賬戶和密碼。
服務端通常提供多組功能不同的API。在使用某組API之前,某應用A必須申請這組API的調用權限(實際申請時通常要說明使用頻率等信息,以供服務端進行審核)。審核通過后,應用A獲取這組API的調用權限。這時以應用A的名義發出的對這組API的調用請求,服務端才會受理。
進一步,當應用A需要訪問某個用戶B存儲在服務端的私有數據時,還需要用戶B的授權。具體來講,應用A會引導用戶B訪問一個位于服務端的URL,這個URL是一個授權頁面。由于URL中附帶了應用A的client_id參數,則用戶B看到的頁面就包含申請授權的應用A的身份信息。在頁面中,用戶B需要輸入賬戶密碼進行授權(Login & Authorization)。由于這個頁面位于服務端,因此用戶B的賬戶密碼并不經過應用A。
用戶B授權之后,服務端會生成一個authorization code,通常通過重定向用戶瀏覽器的方式將這個code交給應用A。應用A可以使用code從服務端換取一個access token,至此授權結束。之后,應用只需在每次調用API時附加這個token即可(具體可以放在URL參數或HTTP header)。
從授權流程中可以發現,這個access token唯一對應了一個應用和一個用戶。一個token對應一個應用的意義是,服務端可以根據API調用中附加的token判斷發出API調用的是哪個應用,進而判斷這個應用是否有對這個API的調用權限。一個token對應一個用戶的意義是,服務端可以判斷這次API調用要訪問的是哪個用戶的數據。一個token對應一個應用加一個用戶的意義是,服務端可以判斷這次API調用是否具有對該用戶私有數據的訪問權限。因此,在生成access token之后,只需在API調用中附加token就確認了一次API調用中的三個重要信息,主體(應用身份,API調用權限),客體(用戶身份,被訪問的數據),關系(訪問權限)。
來自:http://my.oschina.net/philosopher/blog/359109