淺析Oauth2.0開放授權協議

一、概念及場景

Oauth2.0(Open Authorization)協議是一個關于授權(authorization)的開放網絡標準,是目前應用最廣泛的標準之一。簡單講,所謂授權指的是我們通過微信、github等帳號的方式登錄比如V2EX、知乎、簡書這樣的網站或應用。目前包括github、facebook、twitter、微信、微博、QQ等社交工具都集成了Oauth2.0協議以供第三方應用程序使用,實現一個社交帳號打通所有應用。

停下來想一想,刷朋友圈的時候是不是經常遇到這樣的情況呢( ̄▽ ̄),下面我將結合自己的開發和校招經歷,分享一下在Oauth2.0的授權碼模式下進行第三方應用程序開發的過程。


用戶授權

二、授權的角色

1、Third-party application:第三方應用程序,即上面提到的V2EX、知乎、簡書

2、Resource Owner:資源所有者,也就是持有微信、github帳號的用戶。

3、User Agent:用戶代理,比如瀏覽器這樣的工具。

4、Authorization server:認證服務器,也就是微信、github配置的專門用來處理認證的服務器。

5、Resource server:資源服務器,即微信、github存放用戶生成的資源如帳號、頭像、昵稱等的服務器。需要注意的是它與認證服務器,可以是同一臺服務器,也可以是不同的服務器

三、授權的模式

客戶端必須得到用戶的授權(authorization grant),才能獲得用戶獲取資源比如微信頭像、昵稱等的令牌(access token)。OAuth 2.0定義了四種授權方式。

1、授權碼模式(authorization code)

2、簡化模式(implicit)

3、密碼模式(resource owner password credentials)

4、客戶端模式(client credentials)

其中,授權碼模式(authorization code)是功能最完整、流程最嚴密的授權模式。

四、授權碼(Authorization Code)模式

在開發準備階段,需要從服務提供商開發者平臺(以金數據為例)注冊,取得用以獲得授權碼(code)授權域(授權的網址)應用ID(client_id)對應密鑰(client_secret),并配置我們要開發的第三方應用的回調地址(redirect_uri)、授權范圍(scope);這就相當于校招的時候網申、考核的過程。

當我們畢業參加招聘時一般會經歷下面幾個過程

報名?---->參加筆試面試---->公司發放offer---->拿到offer后進入公司拿到工牌---->有了工牌就可以使用公司的資源

其實整個Oauth2.0的授權碼模式和這個很相似。

(1)流程示意圖:

Oauth2.0授權碼模式示意圖

(2)完整的過程:

第一步,帶上這些參數向認證服務器(Authorization server)發送授權請求,認證服務器收到請求,驗證參數,若成功,彈出登錄頁面或授權頁面(比如上圖的截圖),若參數不一致,彈出錯誤。這一步好比校招的時候參加面試(??ω??)

*請求參數包括應用ID(client_id)、回調地址(redirect_uri)、授權范圍(scope)、response_type(Oauth2.0為code)、狀態(state)等

第二步,資源所有者(用戶)確認授權,認證服務器攜帶授權碼(code)和狀態參數(state)返回請求到相應的回調地址(redirect_uri)。可以類比校招的時候參公司給你發了offer (°?°)?

第三步,拿到了offer后,哦不,拿到了授權碼(code),就可以向認證服務器請求令牌(access token),認證服務器會返回生成的令牌(access token)及刷新令牌時用到的(refresh token)等參數。發工牌啦 ("▔□▔)/

*請求參數包括應用ID(client_id)、對應密鑰(client_secret)、、上一步獲得的授權碼(code)、回調地址(redirect_uri)、授權模式(grant_type,這里是authorization_code)、授權范圍(scope)、上一步獲得的狀態(state)等

第四步,用戶代理(瀏覽器)攜帶令牌(access token)向資源服務器發送請求,訪問在第三方應用程序授權范圍(scope)內的資源,比如微信名稱、頭像等。拿到了工牌之后可以享受公司的資源 (⌒▽⌒)


五、那些坑

1、回調地址必須一致;

有時候我們在測試服務器時授權是正常的,在產品服務器上就不行,因為回調地址是唯一的,且嚴格一致的。

2、refresh token的過期時間問題;

因為每個令牌(access token)都是有過期時間(expires_in)的,一般默認為7200s,也就是2h,令牌過期后如果進行訪問資源,服務器會返回403(未授權)錯誤,所以令牌必須即時提前刷新。

為了避免重新獲得令牌的過程剛開始一樣復雜,Oauth2.0規定每個令牌(access token)生成時必須同時生成過期時間(expires_in)和刷新令牌(refresh token),在任意時間,使用刷新令牌(refresh token)可以向認證服務器請求生成一個新的令牌(access token),此時原有的令牌和刷新令牌失效!所以如果你的本地環境和測試服務器使用的是同一個令牌時,當本地環境提前刷新token后,將造成你的測試服務器無法繼續刷新token;

刷新token的2種方式:

1、主動式:提前存好令牌(access token)的過期時間(令牌過期時間=獲得accesstoken的時間+過期時間(expires_in)- 冗余時間t)。在服務器運行crontab定時任務, 每隔小于t的時間,檢查數據庫中所有用戶token的令牌過期時間是否大于當前時間,自動刷新;這樣的好處是保證每時每刻token都是有效的,但是對于服務器有一定負載;

2、被動式:(令牌過期時間=獲得access token的時間+過期時間(expires_in)。當要使用當前令牌(access token)時,檢查該令牌過期時間是否大于當前時間,進行刷新;這是最簡單的做法,能夠節省資源,但是有一定幾率會造成用戶體驗過慢,畢竟刷新token需要時間;不推薦被動式刷新。


以上是我在進行金數據應用中心的抽獎應用的開發過程中的一些體會,當然,目前基本上所有的框架都封裝了Oauth2.0的庫,大家只需要按照文檔使用這些庫,如果大家是Rails愛好者,給大家推薦一下Omniauth,如果大家是PHP Laravel的開發者,給大家推薦一下Laravel Socialite這個庫,當然,像金數據這樣的純api有很多復雜的請求,大家可以參考我做的集成SocialiteForJinshuju

歡迎大家能分享更多的內容,嗶哩嗶哩 - ( ゜- ゜)つロ 乾杯~?

參考:

1、理解OAuth 2.0 - 阮一峰的網絡日志

2、金數據應用中心API開放文檔

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容