博客 / 詳情

返回

淺談OAuth2.0授權模式理解(理論+圖解)

前言

1,假設我住在一個大型的居民小區。小區有門禁系統。
2,我呢比較喜歡網購,每天都有快遞員來送貨。
3,快遞員想通過門禁系統,進入小區,
4,如果我把自己的密碼,告訴快遞員,他就擁有了與我同樣的權限,這樣好像不太合適,安全風險不可控。然後我想取消他進入小區的權力,也很麻煩,我自己的密碼也得跟着改了,還得通知其他的快遞員。
5,有沒有一種辦法讓快遞員自由進入小區,又不把自己的密碼告訴快遞員,並且他唯一的權限就是送貨。

授權機制的設計

1,在門禁卡中增加一個按鈕,快遞員按這個按鈕,去申請授權。
2,我的手機就會顯示這個快遞員的基本信息,我確認請求屬實,告訴門禁系統,我同意給予他進入小區的授權。
3,門禁系統得到我的確認以後,向快遞員顯示一個進入小區的令牌(access_token)。令牌就是類似密碼的一串數字,只在短期內(比如七天)有效。
4,快遞員向門禁系統輸入令牌,進入小區。
image.png

OAuth2.0

把上面的例子搬到互聯網中就是OAuth2.0的設計了。

什麼是OAuth2.0

在OAuth2.0中“O”是Open的簡稱,表示“開放”的意思。Auth表示“授權”的意思,所以連起來OAuth表示“開放授權”的意思,簡單理解就是,數據的所有者告訴系統,同意授權第三方應用進入系統,獲取這些數據。系統從而產生一個短期的進入令牌(access_token),用來代替密碼,供第三方應用使用。

三方指的是哪三方?

  1. 第三方應用:要獲取用户(資源擁有者)存儲在服務提供商裏的資源的實例,通常是客户端,這裏我們用的思否就是第三方應用;
  2. 服務提供者:存儲用户(資源擁有者)的資源信息的地方,向第三方應用提供用户相關信息的服務方,例如我們登錄時的微信、QQ;
  3. 用户/資源擁有者:拿三方登錄來説,指的是在微信或QQ中註冊的用户;

image.png

交互流程

image.png

  1. 用户打第三方開客户端後,第三方客户端要訪問服務提供方,要求用户給予授權;
  2. 用户同意給予第三方客户端訪問服務提供方的授權,並返回一個授權憑證Code;
  3. 第三方應用使用第2步獲取的授權憑證Code和身份認證信息(appid、appsecret),向授權認證服務器申請授權令牌(token);
  4. 授權認證服務器驗證三方客户端的授權憑證Code碼和身份通過後,確認無誤,同意授權,並返回一個資源訪問的令牌(Access Token);
  5. 第三方客户端使用第4步獲取的訪問令牌Access Token)向資源服務器請求相關資源;
  6. 資源服務器驗證訪問令牌(Access Token)通過後,將第三方客户端請求的資源返回,同意向客户端開放資源;
  7. 下面是時序圖:

image.png

OAuth2.0的授權模式

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

1、授權碼模式

步驟如下:
使用微信登錄京東,會跳到微信的授權頁面。
微信認證驗證通過後,回調京東網站提供的回調地址,並帶上認證access_token。
京東接收到access_token後,在拿取在微信上註冊的client_id 和client_secret,去請求access_token。

簡陋的時序圖
image.png

2、簡化模式(隱藏式)

在授權碼模式上減去了,獲取授權碼的步驟,直接返回access_token

步驟如下:
使用微信登錄京東,會跳到微信的授權頁面。
微信認證驗證通過後,回調京東網站提供的回調地址,access_token。

簡陋的時序圖
image.png

3、密碼模式

在京東的登錄頁面上輸入微信的用户名和密碼進行登錄

步驟如下:
在京東的登錄頁面上輸入微信的用户名和密碼。
京東攜帶賬號和密碼去,微信上認證。
微信認證通過返回access_token給京東。

簡陋的時序圖
image.png

4、客户端模式

客户端以自己的名義,而不是以用户的名義,向"服務提供商"進行認證;在這種模式中,用户直接向客户端註冊,客户端以自己的名義要求"服務提供商"提供服務。這裏就不適合在叫做京東和微信了,這樣不適合理解。

簡陋的時序圖
image.png

總結

四種授權中:
授權碼模式:最為複雜,但也是安全係數最高的。
簡化模式:不需要獲取授權碼,適用於靜態網頁應用。
密碼模式:必須信任,不然會寄。
客户端模式:適用於僅由應用本身使用的機密、非用户相關的資源訪問。

參考

https://www.ruanyifeng.com/
https://juejin.cn/post/7010636081305485319
聊編程
哪有不對地方,還請指正。

user avatar columsys 頭像 huanjinliu 頭像 mmmy_a 頭像 codinger 頭像 jasinyip 頭像 hellotech 頭像 imwty 頭像 it1042290135 頭像
8 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.