淺析Oauth2.0開放授權(quán)協(xié)議

一妨马、概念及場景

Oauth2.0(Open Authorization)協(xié)議是一個關(guān)于授權(quán)(authorization)的開放網(wǎng)絡(luò)標(biāo)準(zhǔn)挺举,是目前應(yīng)用最廣泛的標(biāo)準(zhǔn)之一杀赢。簡單講,所謂授權(quán)指的是我們通過微信湘纵、github等帳號的方式登錄比如V2EX脂崔、知乎、簡書這樣的網(wǎng)站或應(yīng)用梧喷。目前包括github砌左、facebook、twitter铺敌、微信汇歹、微博、QQ等社交工具都集成了Oauth2.0協(xié)議以供第三方應(yīng)用程序使用偿凭,實現(xiàn)一個社交帳號打通所有應(yīng)用产弹。

停下來想一想,刷朋友圈的時候是不是經(jīng)常遇到這樣的情況呢( ̄▽ ̄)弯囊,下面我將結(jié)合自己的開發(fā)和校招經(jīng)歷痰哨,分享一下在Oauth2.0的授權(quán)碼模式下進(jìn)行第三方應(yīng)用程序開發(fā)的過程。


用戶授權(quán)

二常挚、授權(quán)的角色

1作谭、Third-party application:第三方應(yīng)用程序,即上面提到的V2EX奄毡、知乎折欠、簡書

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

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

4趟佃、Authorization server:認(rèn)證服務(wù)器扇谣,也就是微信、github配置的專門用來處理認(rèn)證的服務(wù)器闲昭。

5罐寨、Resource server:資源服務(wù)器,即微信序矩、github存放用戶生成的資源如帳號鸯绿、頭像、昵稱等的服務(wù)器。需要注意的是它與認(rèn)證服務(wù)器瓶蝴,可以是同一臺服務(wù)器毒返,也可以是不同的服務(wù)器

三、授權(quán)的模式

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

1、授權(quán)碼模式(authorization code)

2蝎宇、簡化模式(implicit)

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

4、客戶端模式(client credentials)

其中姥芥,授權(quán)碼模式(authorization code)是功能最完整兔乞、流程最嚴(yán)密的授權(quán)模式。

四凉唐、授權(quán)碼(Authorization Code)模式

在開發(fā)準(zhǔn)備階段庸追,需要從服務(wù)提供商開發(fā)者平臺(以金數(shù)據(jù)為例)注冊,取得用以獲得授權(quán)碼(code)授權(quán)域(授權(quán)的網(wǎng)址)台囱、應(yīng)用ID(client_id)對應(yīng)密鑰(client_secret)淡溯,并配置我們要開發(fā)的第三方應(yīng)用的回調(diào)地址(redirect_uri)、授權(quán)范圍(scope)簿训;這就相當(dāng)于校招的時候網(wǎng)申咱娶、考核的過程。

當(dāng)我們畢業(yè)參加招聘時一般會經(jīng)歷下面幾個過程

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

其實整個Oauth2.0的授權(quán)碼模式和這個很相似强品。

(1)流程示意圖:

Oauth2.0授權(quán)碼模式示意圖

(2)完整的過程:

第一步膘侮,帶上這些參數(shù)向認(rèn)證服務(wù)器(Authorization server)發(fā)送授權(quán)請求,認(rèn)證服務(wù)器收到請求的榛,驗證參數(shù)琼了,若成功,彈出登錄頁面或授權(quán)頁面(比如上圖的截圖)夫晌,若參數(shù)不一致雕薪,彈出錯誤。這一步好比校招的時候參加面試(??ω??)

*請求參數(shù)包括應(yīng)用ID(client_id)晓淀、回調(diào)地址(redirect_uri)蹦哼、授權(quán)范圍(scope)、response_type(Oauth2.0為code)要糊、狀態(tài)(state)等

第二步,資源所有者(用戶)確認(rèn)授權(quán),認(rèn)證服務(wù)器攜帶授權(quán)碼(code)和狀態(tài)參數(shù)(state)返回請求到相應(yīng)的回調(diào)地址(redirect_uri)锄俄。可以類比校招的時候參公司給你發(fā)了offer (°?°)?

第三步局劲,拿到了offer后,哦不奶赠,拿到了授權(quán)碼(code)鱼填,就可以向認(rèn)證服務(wù)器請求令牌(access token),認(rèn)證服務(wù)器會返回生成的令牌(access token)及刷新令牌時用到的(refresh token)等參數(shù)毅戈。發(fā)工牌啦 ("▔□▔)/

*請求參數(shù)包括應(yīng)用ID(client_id)苹丸、對應(yīng)密鑰(client_secret)、苇经、上一步獲得的授權(quán)碼(code)赘理、回調(diào)地址(redirect_uri)、授權(quán)模式(grant_type扇单,這里是authorization_code)商模、授權(quán)范圍(scope)、上一步獲得的狀態(tài)(state)等

第四步蜘澜,用戶代理(瀏覽器)攜帶令牌(access token)向資源服務(wù)器發(fā)送請求施流,訪問在第三方應(yīng)用程序授權(quán)范圍(scope)內(nèi)的資源,比如微信名稱鄙信、頭像等瞪醋。拿到了工牌之后可以享受公司的資源 (⌒▽⌒)


五、那些坑

1装诡、回調(diào)地址必須一致银受;

有時候我們在測試服務(wù)器時授權(quán)是正常的,在產(chǎn)品服務(wù)器上就不行慎王,因為回調(diào)地址是唯一的蚓土,且嚴(yán)格一致的。

2赖淤、refresh token的過期時間問題蜀漆;

因為每個令牌(access token)都是有過期時間(expires_in)的,一般默認(rèn)為7200s咱旱,也就是2h确丢,令牌過期后如果進(jìn)行訪問資源,服務(wù)器會返回403(未授權(quán))錯誤吐限,所以令牌必須即時提前刷新鲜侥。

為了避免重新獲得令牌的過程剛開始一樣復(fù)雜,Oauth2.0規(guī)定每個令牌(access token)生成時必須同時生成過期時間(expires_in)和刷新令牌(refresh token)诸典,在任意時間描函,使用刷新令牌(refresh token)可以向認(rèn)證服務(wù)器請求生成一個新的令牌(access token),此時原有的令牌和刷新令牌失效!所以如果你的本地環(huán)境和測試服務(wù)器使用的是同一個令牌時舀寓,當(dāng)本地環(huán)境提前刷新token后胆数,將造成你的測試服務(wù)器無法繼續(xù)刷新token;

刷新token的2種方式:

1互墓、主動式:提前存好令牌(access token)的過期時間(令牌過期時間=獲得accesstoken的時間+過期時間(expires_in)- 冗余時間t)必尼。在服務(wù)器運行crontab定時任務(wù), 每隔小于t的時間篡撵,檢查數(shù)據(jù)庫中所有用戶token的令牌過期時間是否大于當(dāng)前時間判莉,自動刷新;這樣的好處是保證每時每刻token都是有效的育谬,但是對于服務(wù)器有一定負(fù)載券盅;

2、被動式:(令牌過期時間=獲得access token的時間+過期時間(expires_in)斑司。當(dāng)要使用當(dāng)前令牌(access token)時渗饮,檢查該令牌過期時間是否大于當(dāng)前時間,進(jìn)行刷新宿刮;這是最簡單的做法互站,能夠節(jié)省資源,但是有一定幾率會造成用戶體驗過慢僵缺,畢竟刷新token需要時間胡桃;不推薦被動式刷新。


以上是我在進(jìn)行金數(shù)據(jù)應(yīng)用中心的抽獎應(yīng)用的開發(fā)過程中的一些體會磕潮,當(dāng)然翠胰,目前基本上所有的框架都封裝了Oauth2.0的庫,大家只需要按照文檔使用這些庫自脯,如果大家是Rails愛好者之景,給大家推薦一下Omniauth,如果大家是PHP Laravel的開發(fā)者膏潮,給大家推薦一下Laravel Socialite這個庫锻狗,當(dāng)然,像金數(shù)據(jù)這樣的純api有很多復(fù)雜的請求焕参,大家可以參考我做的集成SocialiteForJinshuju轻纪。

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

參考:

1叠纷、理解OAuth 2.0 - 阮一峰的網(wǎng)絡(luò)日志

2刻帚、金數(shù)據(jù)應(yīng)用中心API開放文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涩嚣,隨后出現(xiàn)的幾起案子崇众,更是在濱河造成了極大的恐慌掂僵,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件校摩,死亡現(xiàn)場離奇詭異看峻,居然都是意外死亡,警方通過查閱死者的電腦和手機衙吩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溪窒,“玉大人坤塞,你說我怎么就攤上這事〕喊觯” “怎么了摹芙?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宛瞄。 經(jīng)常有香客問我浮禾,道長,這世上最難降的妖魔是什么份汗? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任盈电,我火速辦了婚禮,結(jié)果婚禮上杯活,老公的妹妹穿的比我還像新娘匆帚。我一直安慰自己,他們只是感情好旁钧,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布吸重。 她就那樣靜靜地躺著,像睡著了一般歪今。 火紅的嫁衣襯著肌膚如雪嚎幸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天寄猩,我揣著相機與錄音嫉晶,去河邊找鬼。 笑死焦影,一個胖子當(dāng)著我的面吹牛车遂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斯辰,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舶担,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了彬呻?” 一聲冷哼從身側(cè)響起衣陶,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柄瑰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剪况,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體教沾,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年译断,在試婚紗的時候發(fā)現(xiàn)自己被綠了授翻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡孙咪,死狀恐怖堪唐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翎蹈,我是刑警寧澤淮菠,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站荤堪,受9級特大地震影響合陵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澄阳,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一拥知、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寇荧,春花似錦举庶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至峦嗤,卻和暖如春蕊唐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烁设。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工替梨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人装黑。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓副瀑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恋谭。 傳聞我的和親對象是個殘疾皇子糠睡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容