談談你對OAuth的理解,這道題你會了嗎?
1位工作5年的小夥伴被問到這樣一道面試題,說談談你對OAuth的理解。當時,這位小夥伴感覺回答得不是很理想,希望我拍一期視訊詳細地介紹一下。
今天,我給大家講一講,我對這個問題的理解。
1、什麼是 OAuth
OAuth是一個關於授權(Authorization)的開放技術標準,在全世界得到廣泛應用,它本質上是一種協議,可以在不共享使用者使用者名稱和密碼的前提下,實現將授權從應用程式另一個應用程式。如圖所示:
咱們可以使用QQ或者微信直接登入京東APP,而無需在京東重新註冊使用者。相當於,使用者可以在一個平臺上登入,獲得授權後,也可在另一平臺上執行操作和檢視資料。使用最為廣泛的場景是SSO(單點登入)。
舉個例子,有一位訪客需要在房主不在家時進到房間裡面,房主又不能把門鎖密碼告訴訪客,而是給預先發給訪客一張臨時房卡,這張房卡刷一次就失效了。OAuth 的工作方式和這個場景非常類似,一個應用程式向另一個應用傳送授權令牌來授予使用者訪問許可權,而不是傳送使用者的密碼。
2、OAuth的工作原理
我們知道,任何的身份認證,本質上都是基於對請求方的不信任產生的。而OAuth的出現,主要是解決多個應用之間的授權信任問題。在OAuth的互動過程中有四個參與角色,如圖所示:
它們分別是:
- 資源所有者(Resource Owner):一般是指咱們自己。
- 客戶端(Client):一般是指需要授權的應用,比如京東APP。
- 資源伺服器(Resource Server):一般是指儲存資訊的伺服器,比如QQ密碼和微信密碼的伺服器。
- 授權伺服器(Authorization Server):一般是指提API的伺服器,比如QQ的Open API服務,微信的Open API服務。
一般情況下,資源伺服器和認證伺服器是同一個服務,這樣更方便呼叫。OAuth的工作原理如圖所示:
第1步:客戶端向資源擁有者傳送授權請求,一般資源擁有者的資源會存放在資源伺服器。
第2步:客戶端會收到資源伺服器的授權許可。
第3步:客戶端拿到許可之後,再向授權伺服器傳送一次驗證,給客戶端頒發一個Access Token訪問令牌。
第4步:客戶端拿到令牌之後,交給資源伺服器。
第5步:資源伺服器會將獲取到的令牌傳給認證伺服器驗證令牌的有效性。
第6步:資源伺服器驗證令牌通過之後,就會返回一個受保護的資源。
在我們看到的這個流程中,最重要的是第2步,也就是在第3步獲取授權之前,客戶端要先申請許可資源的內容,比如使用者頭像,使用者暱稱等等。也就是客戶端向資源伺服器申請授權的時候,需要填寫以下授權所需的資訊,分別是:應用名稱、應用網站、重定向URI或者回調的URL(redirect_uri)、客戶端標識client_id和客戶端金鑰client_secret。這些資訊需要我們在 。
當然,OAuth一共設計了四種授權模式,分別是:
授權碼模式(Authorization Code Grant)。
簡化模式(Implicit Grant)。
密碼模式(Resource Owner Password Credentials Grant)。
客戶端模式(Client Credentials Grant)。
由於視訊時長的限制,我這裡就不詳細介紹了。有興趣的小夥伴可以在評論區回覆666,我可以單獨再拍攝一期視訊專門講解。
3、關於OAuth 2.0
OAuth 2.0 是 OAuth 的最新版本。OAuth 的首版於 2010 年釋出。OAuth 2.0 於 2012 年釋出,修復了 OAuth 1.0 中存在的若干漏洞。目前,大家基本上都只會使用OAuth2.0了。
好了,以上就是我對OAuth的理解。
- Spring中實現非同步呼叫的方式有哪些?
- 帶引數的全型別 Python 裝飾器
- 整理了幾個Python正則表示式,拿走就能用!
- SOLID:開閉原則Go程式碼實戰
- React中如何引入CSS呢
- 一個新視角:前端框架們都卷錯方向了?
- 編碼中的Adapter,不僅是一種設計模式,更是一種架構理念與解決方案
- 手寫程式語言-遞迴函式是如何實現的?
- 一文搞懂模糊匹配:定義、過程與技術
- 新來個阿里 P7,僅花 2 小時,做出一個多執行緒永動任務,看完直接跪了
- Puzzlescript,一種開發H5益智遊戲的引擎
- @Autowired和@Resource到底什麼區別,你明白了嗎?
- CSS transition 小技巧!如何保留 hover 的狀態?
- React如此受歡迎離不開這4個主要原則
- LeCun再炮轟Marcus: 他是心理學家,不是搞AI的
- Java保證執行緒安全的方式有哪些?
- 19個殺手級 JavaScript 單行程式碼,讓你看起來像專業人士
- Python 的"self"引數是什麼?
- 別整一坨 CSS 程式碼了,試試這幾個實用函式
- 再有人問你什麼是MVCC,就把這篇文章發給他!