四種方式:
- 授權碼模式(grant_type--->authorization_code)
- 簡化模式(response_type--->token)
- 密碼模式(grant_type--->password)
- 客戶端模式(grant_type--->client_credentials)
適用場景
- 授權碼模式:安全性高,使用率高,流程復雜。要求第三方應用必須有服務器。對安全性要求較高,web項目中一般使用授權碼模式。
- 簡化模式:流程簡單;適用於純前端應用,不安全。Token有效期短,瀏覽器關閉即失效
- 密碼模式:需要輸入賬號密碼,極度不安全,需要高度信任第三方應用適用於其他授權模式都無法采用的情況;原生APP可以使用,web不建議使用
- 客戶端模式:授權維度為應用維度,而不是用戶維度。因此有可能多個用戶共用一個Token的情況。適用於應用維度的共享資源。適用於服務器之間交互,不需要用戶參與。
一、授權碼模式
1、授權碼模式介紹

(1)資源擁有者打開客戶端,客戶端要求資源擁有者給予授權,它將瀏覽器被重定向到授權服務器,重定向時會附加客戶端的身份信息。如:
Get請求:
http://localhost:53020/uaa/oauth/authorize?client_id=c1&response_type=code&scope=ROLE_ADMIN&redirect_uri=http://www.baidu.com

參數列表如下:
- client_id:客戶端准入標識。
- response_type:授權碼模式固定為code。
- scope:客戶端權限。
- redirect_uri:跳轉uri,當授權碼申請成功后會跳轉到此地址,並在后邊帶上code參數(授權碼)。
(2)瀏覽器出現向授權服務器授權頁面,之后將用戶同意授權。
(3)授權服務器將授權碼(AuthorizationCode)轉經瀏覽器發送給client(通過redirect_uri)。
(4)客戶端拿着授權碼向授權服務器索要訪問access_token,請求如下:
Post請求:
localhost:53020/uaa/oauth/token
參數列表如下
- client_id:客戶端准入標識。
- client_secret:客戶端秘鑰。
- grant_type:授權類型,填寫authorization_code,表示授權碼模式
- code:授權碼,就是剛剛獲取的授權碼,注意:授權碼只使用一次就無效了,需要重新申請。
- redirect_uri:申請授權碼時的跳轉url,一定和申請授權碼時用的redirect_uri一致。
請求示例:grant_type--->authorization_code
響應成功示例:
(5)授權服務器返回令牌(access_token)
這種模式是四種模式中最安全的一種模式。一般用於client是Web服務器端應用或第三方的原生App調用資源服務
的時候。因為在這種模式中access_token不會經過瀏覽器或移動端的App,而是直接從服務端去交換,這樣就最大
限度的減小了令牌泄漏的風險。
二、簡化模式

(1)資源擁有者打開客戶端,客戶端要求資源擁有者給予授權,它將瀏覽器被重定向到授權服務器,重定向時會附加客戶端的身份信息。如:
Get請求:response_type--->token
http://localhost:53020/uaa/oauth/authorize?client_id=c1&response_type=token&scope=all&redirect_uri=http://www.baidu.com
參數描述同授權碼模式 ,注意
response_type=token,說明是簡化模式。
(2)瀏覽器出現向授權服務器授權頁面,之后將用戶同意授權。
(3)授權服務器將授權碼將令牌(access_token)以Hash的形式存放在重定向uri的fargment中發送給瀏覽器。
響應成功示例:

三、密碼模式
(1)資源擁有者將用戶名、密碼發送給客戶端
(2)客戶端拿着資源擁有者的用戶名、密碼向授權服務器請求令牌(access_token),請求如下:
Post請求:
localhost:53010/uaa/oauth/token
參數列表如下:
- client_id:客戶端准入標識。
- client_secret:客戶端秘鑰。
- grant_type:授權類型,填寫password表示密碼模式
- username:資源擁有者用戶名。
- password:資源擁有者密碼。
(3)授權服務器將令牌(access_token)發送給client
這種模式十分簡單,但是卻意味着直接將用戶敏感信息泄漏給了client,因此這就說明這種模式只能用於client是我們自己開發的情況下。因此密碼模式一般用於我們自己開發的,第一方原生App或第一方單頁面應用。
請求示例:grant_type--->password

響應成功示例:
四、客戶端模式
(1)客戶端向授權服務器發送自己的身份信息,並請求令牌(access_token)
(2)確認客戶端身份無誤后,將令牌(access_token)發送給client,請求如下:
Post請求
localhost:53020/uaa/oauth/token
參數列表如下:
- client_id:客戶端准入標識。
- client_secret:客戶端秘鑰。
- grant_type:授權類型,填寫client_credentials表示客戶端模式
這種模式是最方便但最不安全的模式。因此這就要求我們對client完全的信任,而client本身也是安全的。因此這種模式一般用來提供給我們完全信任的服務器端服務。比如,合作方系統對接,拉取一組用戶信息。
請求示例:grant_type--->client_credentials
響應成功示例: