OAuth2.0 原理簡介
寫在前面:
在正式介紹OAuth2.0之前我們先來看一個場景:小李是一個文藝小青年, 經常喜歡出去旅遊並且把自己旅行中的美景照片分享到各大社交網站上,比如朋友圈,新浪微博。小李馬上要向女朋友求婚了,他想把這三年來和自己女朋友出去旅遊的照片打印出來做成照片墻,好在求婚的時候講女友感動的一塌糊塗,然後你懂得...,那麽問題來了,按照小李帶女朋友一個月出去玩一次,每次分享30張照片,三年就是30 * 12 * 3 = 1080 張,小李現在想把這1080張照片全部打印出來他首先得找個提供打印照片服務的公司(美圖快印),然後把需要打印的照片給到服務公司然後才能打印。怎麽把這些照片給到美圖快印呢,一般來說有下面兩種方式:
1.小李到自己的微博相冊中吭哧吭哧下載他需要打印的所有照片,然後裝到U盤裏或者轉儲到網盤裏,再給到美圖快印(那可是1080張照片啊,純手工操作,好累啊)
2.小李到美圖快印告訴工作人員自己的賬戶名和密碼,並告訴他那些需要打印,那些不需要打印,然後小李還會擔心:自己和女友的親密照被工作人員看到了怎麽辦(更可怕的是某一天自己會不會出現在某論壇上成為網紅)?萬一他記住了我的密碼然後悄悄的登陸上去把我的密碼改了怎麽辦?。。。。
小李覺得有點頭疼了,有沒有什麽方法客戶既不告訴工作人員自己的賬號和密碼又能夠方便快捷的把照片給到美圖快印呢?
這就要說到我們今天的正題了,用OAuth就可以輕松的解決此類特定範圍的授權問題。
OAuth2.0簡介:
OAuth2.0 是一個開放的工業標準的授權協議,它允許用戶授權讓第三方應用直接訪問用戶在某一個服務中的特定資源,但是不提供給第三方賬號及密碼信息。完整定義請移步官網:https://oauth.net/2/
OAuth2.0的基本概念
在了解OAuth2.0之前我們有必要先介紹一下下面幾個基本的概念:
1. 資源所有者(Resource Owner):一個能夠訪問受保護資源的實體。當資源所有者是一個人時,它被稱為終端用戶。(小李)
2. 資源服務器(Resource Server):托管受保護資源的服務器,能夠使用訪問令牌接受和響應受保護的資源請求。(新浪微博)
3. 客戶端(Client):代表資源所有者和其授權的應用程序來保護資源請求。術語客戶端並不意味著任何特定的實現特征(例如,應用程序是否在服務器、桌面或其他設備上執行)(美圖快印)
4. 授權服務器(Authorization Server):在成功驗證資源所有者並獲得授權之後,服務器向客戶端發出訪問令牌。(授權服務器是用來管理Resource Owner,Resource Server,Client的中間人)
Authorization Server和Resource Server可以使獨立的服務提供商,也可以是在一起的,比如上面例子中新浪微博既作授權服務器也用來存儲用戶的圖片資源,OAuth2解決的問題是:通過Authorization Server可以提供一個訪問的憑據(token)給client(美圖快印的工作人員),使得client可以在不知道Resource Owner以及Resource Server的用戶名和密碼的情況下訪問到Resource Owner受保護的資源,它是一個完美的中間人。
OAuth2.0詳解
通常 Resource server本身就提供Authorization server服務,它主要提供兩類接口:
- 授權服務接口:接受Client的授權請求,並引導用戶到Resource server完成登陸授權的過程。
- 獲取訪問令牌的接口:使用授權接口提供的許可憑據來頒發Resource owner的訪問令牌給Client,或由Client更新過期的訪問令牌。
除此之外還需要提供一個第三方應用程序註冊管理的服務。通常情況下會為註冊完成的第三方應用程序分配兩個成對出現的重要參數:
- client_id:第三方應用程序的一個標識id,這個信息通常是公開的信息,用來區分哪一個第三方應用程序。
- client_secret:第三方應用程序的私鑰信息,這個信息是私密的信息,不允許在OAuth2流程中傳遞的,用於安全方面的檢測和加密。
Client在取得client_id和client_secret之後再向Authorization Server發起授權請求,並獲取AccessToken,然後攜帶Token來訪問和消費受保護的資源。美圖快印要想直接獲取小李新浪微博相冊中的照片資源就需要先引導小李到新浪的登陸界面,然後完成授權登陸,然後再向授權服務器發起授權請求,然後獲取到新浪微博辦法給他的token,再攜帶者token才能訪問到微博的相冊。
下面我們來看一下OAuth2.0的詳細授權過程:
我們可以看到在上述的授權過程中最關鍵的部分是獲取token的那一步,這也是OAuth2.0的核心。有了這個token我們就可以訪問到resource server上的資源,ABCD這幾步都是為了獲取這個token。
那麽這個token到底包含了哪些信息呢?我們來從頭分析一下,我們需要實現的是:讓美圖快印能夠在不用小李用戶名和密碼的前提下訪問到小李新浪微博賬戶相冊中的特定圖片。
註意上面加粗的部分,要實現這樣的需求我們需要從token中解析出來下面3類信息:
- 客戶端標識,表明是誰在請求訪問資源(美圖快印);
- 用戶標識,得到了誰的許可(小李);
- 客戶端能訪問資源所有者的哪些資源以及其相應的權限。
有了上面的這些信息,那麽資源服務器(Resouce Server)就可以區分出來是哪個第三方應用(Client)要訪問哪個用戶(Resource Owner)的哪些資源(以及有沒有權限)
在上面的流程中出現了授權許可(Authorization Grant)這個概念,那到底它是什麽意思呢?
書面解釋是:授權許可是一個代表資源所有者授權(訪問受保護資源)的憑據,客戶端用它來獲取訪問令牌。
這個解釋比較抽象,那麽我們來翻譯一下就是:授權許可是小李授予美圖快印獲得新浪微博相冊的訪問令牌的一個憑據。
那麽我們該如何獲得這個憑據吶,OAuth2定義了四種許可類型:
- Authorization Code:授權碼;
- Implicit:隱式許可;
- Resource Owner Password Credentials:資源所有者密碼憑據;
- Client Credentials :客戶端憑據。
具體每一種許可類型到底怎麽實現我們將放到後面詳細討論,本文不做詳細解釋。
寫到最後:
總結:OAuth2.0是一套工業級的標準授權協議,可以很方便的解決第三方服務的授權而不需要資源所有者直接提供身份信息,它大大降低了我們在實現認證和授權時的復雜度。目前基於OAuth2.0實現的框架有很多,基於.NET Core實現最好的是IdentityServer4
在後續文章中我們將一起探討IdentityServer4在.NET Core中的使用,歡迎持續關註。
如果你覺得本文寫得不錯,麻煩給個贊唄~~~
參考資料:
https://oauth.net/2/
OAuth2.0 原理簡介