1. 程式人生 > >白話OAuth2使用者認證及鑑權標準流程

白話OAuth2使用者認證及鑑權標準流程

一、OAuth2需求場景

在說明OAuth2需求及使用場景之前,需要先介紹一下OAuth2授權流程中的各種角色:

  • 資源擁有者(User) - 指應用的使用者
  • 認證伺服器 (Authorization Server) - 提供登入認證介面的伺服器,比如:github等
  • 資源伺服器 (Resources Server) - 提供資源介面及服務的伺服器,通常和認證伺服器是同一個應用。
  • 第三方客戶端(Client) - 第三方應用,希望使用資源伺服器提供的資源
  • 服務提供商(Provider): 認證服務和資源服務歸屬於一個機構,該機構就是服務提供商

如果您對這些角色承擔的作用還不清晰,也請先記住這些角色,繼續往下看:

  • 從資源擁有者,即使用者的角度:舉個例子,使用者在B應用上,想使用自己在A應用中的儲存的圖片等資源。所以使用者希望A應用開放介面給B應用,從而使用自己的這些圖片資源。
  • 從資源提供者的角度:我想讓其他廠商的應用都使用我提供的資源,以增強使用者對我的的粘性。越多的第三方應用依賴於我開放的介面,就表示會有越多的使用者依賴於我。參考:某某平臺開放掃碼登入介面。
  • 從第三方客戶端,即資源申請者的角度:A應用是一個大廠開發的,它那裡使用者量大。A應用既然提供了基於OAuth2的介面,我可以獲取一些基本使用者資料資訊,我幹嘛不用呢。特別是掃碼登入功能介面,給我自己的使用者也帶來了極大的方便,增強了我的應用的使用者體驗。

二、OAuth2授權的流程

OAuth2授權的流程的授權流程還是有點複雜的,用專業的術語很容易把大家弄糊塗,所以我希望給大家舉一個生活中的例子,來幫助理解。

背景:我經營著一個考研自習室,向考研學生出租提供自習室資源。李小明是一位考研學生,自習室資源擁有者,我的使用者。

  • 資源擁有者 - 考研同學李小明
  • 資源伺服器 - 考研自習室及自習室內的資源(書包)
  • 認證伺服器 - 我(考研自習室管理員)
  • 第三方客戶端 - 考研同學李小明家長,第三方申請者

下面我們來結合這張圖理解OAuth2授權的流程:

  • 第一步(第三方申請資源):一個自稱是考研學生家長的人給我打電話:“李小明是在你這裡自習吧?他的書包放在自習室了,我要幫他取一下。”
  • 第二步(驗證資源擁有者): 我此時將信將疑,於是讓家長等一下,同時撥通了李小明視訊,李小明向我確認,的確有這回事。
  • 第三步(認證通過發授權碼):我一看這情況,就和小明家長說:李小明的自習室是“XXXX”地址,但是我不在那,你來我這取一下鑰匙吧。
  • 第四部(申請token令牌):小明家長來到我的地址,告訴我說:來取“XXXX”地址自習室的鑰匙。哦,我一聽就明白了。
  • 第五步(頒發token令牌):於是我找出自習室的鑰匙交給了小明的家長。

從上面的例子中我們看到,小明(使用者)是明顯受益方,他不用跑腿了。我作為自習室經營者(認證伺服器),對外提供這種服務的目的是為了增加使用者粘性,增強使用者體驗。小明的家長作為第三方,他獲取了資源(自習室書包),是為了增強自己的兒子小明的使用者體驗。
以上的授權模式,就是OAuth2最典型的最常被使用的授權碼模式。“XXXX”地址是授權碼,鑰匙是Access Token。用相對專業的說法再說明一次,大家可以對比學習:

  1. 第三方應用,向認證伺服器請求授權。
  2. 使用者告知認證伺服器同意授權(通常是通過使用者掃碼或輸入使用者名稱密碼的方式)
  3. 認證伺服器向第三方應用告知授權碼(code)
  4. 第三方應用使用授權碼(code)申請Access Token
  5. 認證伺服器驗證授權碼,頒發Access Token

這樣第三方應用就可以使用Access Token,訪問服務提供商的介面資源了。(小明家長用鑰匙去自習室取書包)

三、OAuth2四種授權模式

  • 授權碼模式(authorization code)
  • 簡化模式(implicit)
  • 密碼模式(resource owner password credentials)
  • 客戶端模式(client credentials)

在第二節中為大家講述的是授權碼模式。密碼模式也很簡單:

  • 使用者將使用者名稱密碼交給第三方客戶端應用
  • 客戶端將使用者名稱密碼傳送給認證伺服器,認證伺服器驗證後頒發AccessToken
  • 客戶端請求資源介面攜帶AccessToken,服務端對AccessToken進行校驗。
  • 校驗通過,才能獲得介面正確的資料結果響應。

密碼模式與授權碼模式最大的區別在於:授權碼模式申請授權碼的過程是使用者直接與認證伺服器進行互動,然後授權結果由認證伺服器告知第三方客戶端,也就是不會向第三方客戶端暴露服務提供商的使用者密碼資訊。而密碼模式,是使用者將使用者密碼資訊交給第三方,然後由第三方向服務提供商進行認證和資源請求。絕大多數的服務提供商都會選擇使用授權碼模式,避免自己的使用者密碼暴漏給第三方。所以密碼模式只適用於服務提供商對第三方廠商高度信任的情況下才能使用。

其他兩種模式的應用很少,所以不做過多的介紹。想深入瞭解的,自行學習!

期待您的關注

  • 向您推薦博主的系列文件:《手摸手教您學習SpringBoot系列-16章97節》
  • 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格。