OAuth協議為用戶資源的授權提供了一個安全的、開放而又簡易的標准。與以往的授權方式不同之處是OAuth的授權不會使第三方觸及到用戶的帳號信息(如用戶名與密碼),即第三方無需使用用戶的用戶名與密碼就可以申請獲得該用戶資源的授權,因此OAuth是安全的。OAuth支持授權碼模式(authorization_code)、密碼模式(password)、客戶端模式(client_credentials) 、簡化模式(implicit)、刷新令牌模式(refresh_token)這五類授權模式,本文將介紹這五類授權中授權服務的流程。
一 授權碼模式(authorization_code)
1. 客戶端訪問授權服務的授權終端(authorization endpoint),在請求中附帶客戶端的身份信息、請求的授權范圍、當前狀態和授權後跳轉地址。
2. 授權終端比對客戶端的身份信息,校驗授權後跳轉地址與客戶端預留的跳轉地址是否一致。
3. 授權終端校驗用戶是否在授權服務中登錄。若用戶未登錄,跳轉到授權服務的登陸界面。用戶登陸後,跳轉到授權頁面向用戶展示客戶端請求的授權范圍。
4. 若用戶同意授權,授權服務會再一次比對客戶端的身份信息和校驗跳轉地址。然後授權終端產生一個新的不記名令牌,並使用該令牌登錄。
5. 不記名令牌的登錄觸發AuthorizationCodeProvider的OnCreate方法產生授權碼和訪問令牌。將授權碼和訪問令牌進行關聯,然後將授權碼返回給客戶端。
6. 客戶端使用身份信息、跳轉地址、接收到的授權碼向授權服務請求訪問令牌。
7. 授權終端比對客戶端的身份信息,校驗跳轉地址,然後使用授權碼獲取關聯的訪問令牌,將令牌返回給客戶端
8. 觸發RefreshTokenProvider的OnCreate方法,使用訪問令牌創建一個刷新令牌,將刷新令牌也返回給客戶端。
二 密碼模式(password)
1. 用戶將賬號和密碼提供給客戶端。
2. 客戶端使用用戶的賬號和密碼訪問授權服務的授權終端。
3. 授權終端校驗賬號密碼是否正確,校驗通過後創建訪問令牌返回給客戶端。
4. 觸發RefreshTokenProvider的OnCreate方法,使用訪問令牌創建一個刷新令牌,將刷新令牌也返回給客戶端。
三 客戶端模式(client_credentials)
1. 客戶端使用客戶端的身份信息訪問授權服務的授權終端。
2. 授權終端校驗客戶端的身份信息和預留的跳轉地址,校驗通過後創建訪問令牌返回給客戶端。
3. 觸發RefreshTokenProvider的OnCreate方法,使用訪問令牌創建一個刷新令牌,將刷新令牌也返回給客戶端。
四 簡化模式(implicit)
1. 客戶端訪問授權服務的授權終端,在請求中附帶客戶端的身份信息、請求的授權范圍、當前狀態和授權後跳轉地址。
2. 授權終端比對客戶端的身份信息,校驗授權後跳轉地址與客戶端預留的跳轉地址是否一致。
3. 授權終端校驗用戶是否在授權服務中登錄。若用戶未登錄,跳轉到授權服務的登陸界面。用戶登陸後,跳轉到授權頁面向用戶展示客戶端請求的授權范圍。
4. 若用戶同意授權,授權服務會再一次比對客戶端的身份信息和校驗跳轉地址。然後授權終端產生一個新的不記名令牌,並使用該令牌登錄。
5. 不記名令牌的登錄會將用戶的訪問令牌發送給客戶端。即使授權終端實現了AuthorizationCodeProvider的OnCreate方法,也不會觸發該方法,而是直接發放令牌。簡化模式也不會觸發刷新令牌的發放。
五 刷新令牌模式(refresh_token)
1. 客戶端訪問授權服務的授權終端,在請求中附帶客戶端的身份信息和刷新令牌。
2. 授權終端驗證客戶端身份信息,校驗通過後觸發RefreshTokenProvider的OnReceive方法,創建新的訪問令牌,返回給客戶端。
3. 觸發RefreshTokenProvider的OnCreate方法,使用訪問令牌創建一個刷新令牌,將新的刷新令牌也返回給客戶端。