OAuth2.0 授權的四種方式


四種方式:

  • 授權碼模式(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

響應成功示例:

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM