SaaS開放平臺安全鑑權方式: Oauth鑑權機制及接入說明
SaaS開放平臺鑑權,通常使用Oauth鑑權方式,微信開放平臺、淘寶開放平臺等都採用了這種鑑權方式。下面介紹一下Oauth鑑權的原理以及如何接入。
1. Oauth是什麼
Oauth(開放授權,Open Authorization)是一個開放標準。
允許第三方應用在使用者授權的前提下訪問戶在服務商(平臺)那裡儲存的各種資訊。
而這種授權無需將使用者提供使用者名稱和密碼提供給該第三方網站。
OAuth允許使用者提供一個令牌給第三方網站,一個令牌對應一個特定的第三方網站,同時該令牌只能在特定的時間內訪問特定的資源。
原理圖:
Oauth有以下四種授權模式:
• 授權碼授權模式(
• 隱式授權模式(Implicit Grant)
• 密碼授權模式(Resource Owner Password Credentials Grant)
• 客戶端憑證授權模式(Client Credentials Grant)
2. OAuth2.0的介面組成
2.1 Oauth抽象協議流程
2.2 Oauth2.0介面組成
2.2.1 請求授權介面
引數名 |
引數說明 |
是否必傳 |
引數說明 |
client_id |
應用 |
是 |
|
response_type |
“code”/“token” |
是 |
|
redirect_uri |
重定向地址 |
是 |
|
scope |
資源範圍 |
否 |
如果沒有,預設應用的資源範圍 |
status |
應用方狀態 |
否 |
透傳 |
應用的資源範圍scope,如果有需要,可以在申請註冊應用的時候,由平臺方來設定授權的使用者資源列表,可以在使用者授權的時候供使用者來決定是否同意授權,使用者可以選擇哪些資源授權給第三方應用。
2.2.2 請求token
引數名 |
引數說明 |
是否必傳 |
引數說明 |
client_id |
應用ID |
是 |
|
client_secret |
應用祕鑰 |
是 |
|
redirect_uri |
重定向地址 |
是 |
|
grant_type |
“authorization_code”、“refresh_token” |
是 |
|
code |
授權碼 |
是 |
|
refresh_token |
重新整理token |
是 |
返回結果:JSON
2.2.3 請求資源
引數名 |
引數說明 |
是否必傳 |
引數說明 |
access_token |
訪問令牌 |
是 |
|
scope |
資源範圍 |
否 |
如果沒有,預設查詢訪問令牌的資源範圍 |
返回結果:資源資訊的JSON資料(涉及敏感資料的加密,一般使用client_secret)
3. Oauth的安全機制
開放平臺授權模式通常選用授權碼模式,有如下原因:
• Access_token是高度敏感的資料,URL太易於被獲取
• 客戶端的安全性無法保證,使用者賬號密碼有被截獲的風險
Status引數:
• 應用方使用者唯一標識的雜湊值
• 應用方接受到回撥地址後,判斷當前使用者的雜湊值和Oauth伺服器透傳回來的雜湊值是否一致
• 如果不一致,停止繼續請求accessToken
status引數也起到了防重放的作用。
資源提供方(平臺):
• 對client_id和回撥地址做嚴格校驗
• 獲取access token的code僅能使用一次,且與授權使用者關聯
• 儘量避免直接讀取當前使用者session進行繫結
• 有效使用client_secret引數
資源使用方(三方應用):
• 使用Authorization Code方式進行授權
• 授權過程使用state隨機雜湊,並在服務端進行判斷
• 儘量使用HTTPS保證授權過程的安全性
4. 如何接入Oauth?
接入步驟:
1. 在開放平臺申請應用,獲取應用身份(client_id , client_secret),需要提供應用回撥地址,用於接收授權code
2. 生成本地使用者的status,並呼叫申請授權介面,獲取授權code
3. 在回撥地址接收回傳的code和status引數並校驗
4. 通過授權碼code獲取accessToken並儲存
5. 通過accessToken獲取資源
當用戶再次訪問,需要Oauth授權時,應用根據儲存的accessToken的時間,自行判斷是否需要再次授權。
如果不需要使用者授權,根據accessToken內的過期時間判斷access_token是否過期,沒過期直接獲取資源;如果已過期,則使用refresh_token重新整理accessToken並儲存,然後獲取資源。
說明:為了安全期間,accessToken需要設定過期時間,通常設定為12或者24小時;refresh_token永久有效,只是重新獲取accessToken時自動配對變更。