認證與授權——單點登錄協議盤點:OpenID vs OAuth2 vs SAML

無論是Web端還是移動端,現在第三方應用賬戶登錄已經成為了標配,任意打開個網站都可以看到,QQ/微信賬號登錄的字樣。使用第三方賬戶的登錄的過程,既要限制用戶身份只讓有效注冊用戶才能登錄,還要根據注冊用戶的不同身份來控制能瀏覽的內容,這就需要認證授權

相關文章鏈接:

  1. OAuth2.0 協議入門指南
  2. OpenID Connect 協議入門指南
  3. SAML2.0入門指南
  4. OpenSAML 使用引導 I : 簡介——關于OpenSAML你所需知道的一切

1. 何為認證,何為授權

認證authenticate)和授權authorize)是兩個容易被弄混的概念,尤其是只看英文。

認證意味著證實某個用戶是他所聲明的那個人;授權意味決定一個身份確定的用戶能夠訪問那些資源。

由此可見,應用需要先認證用戶身份,然后依據用戶身份再授權,二者需要聯合使用。

對于QQ或者微信這樣的應用,用戶在登錄后會得到該賬戶的身份憑證。如果其他第三方應用信任并接受QQ或者微信的身份憑證,就可以直接使用該憑證通過第三方的認證而登錄。登陸之后用戶能有權限去做什么,這就是第三方應用根據自己政策而進行的授權。我們常遇到有網站在第一次使用QQ或微信賬戶登錄之后需要綁定已用賬戶,就是因為雖然網站能夠通過QQ賬戶的身份認證,但是對于這樣的賬戶沒有對應的授權。

同理,對于一個面向公司內部的服務環境,該公司可能有郵箱系統、網上辦公系統、財務系統等等。如果這些系統都是獨立的,那么公司的員工就需要每一個系統都分配一個賬戶,每個系統都需要單獨登錄。這樣顯然是低效而麻煩的,更好的解決方案應該是用戶在內網中只需要登錄一次,所有的子應用系統都能認證其身份,而免去重復登錄,這樣的方案就被稱為單點登錄(single sign-on, SSO)。

這樣做的最明顯的好處就是提高用戶體驗,用戶只需要維護一對用戶名和口令可以在公司內部暢通無阻。同時,因為是單點登錄,所有的用戶身份的都被統一認證,也就是說用戶的身份憑據(比如口令)只被保存在一處,其他子系統并不直接獲得用戶的口令等敏感信息,而是接收來自可信來源的身份證明。

單點登錄和統一認證中主要的三個協議是OpenID, OAuth, 金和 SAML,被稱為單點登錄的三駕馬車。這些協議已經有了各種語言版本的實現,本人也在其他文字做了詳盡的介紹,這里專門對比下三種協議的異同。

2. OpenID

OpenID是一種認證標準,互聯網上有很多賬戶都是支持OpenID比如谷歌、雅虎、PayPal等等。

用戶要使用OpenID就必須先在OpenID身份服務器(Identity Provider, IDP)獲得OpenID 賬號(比如Google賬戶)。用戶可以使用OpenID賬戶來登錄任何一個接受OpenID認證的服務應用(the relying party,RP,依賴方)。OpenID協議標準就是提供一個框架用來IDP和RP之間通信。


單點登錄

本質而言,用戶的OpenID是一個為用戶個人所擁有的特殊URL(比如 alice2016.openid.com),所以有些網站甚至會提供選項讓用戶自己去填寫OpenID。


OpenID

FaceBook曾經也是使用過OpenID的,后來轉而開發FaceBook Connect.

OpenID的最新版本是OpenID Connect。具體協議信息請見這里 OpenID Connect 協議入門指南

3. OAuth2

準確來講,OAuth2是一個授權的標準協議。也許會令人困惑,OAuth2是OpenID-Connect的基礎,但是OpenID-Connect是認證協議(在OpenID-Connect中,ID-Token也被當做是一種資源)。

讓我們回到OAuth2,OAuth2提供了一種代理訪問機制,也就是說一個應用(可以被稱為客戶端)可以代替用戶到資源服務器上獲得屬于用戶的資源或是進行符合用戶權限的操作 ,而用戶不用將自己的用戶名和口令等身份憑據分享給客戶端。OAuth2是通過IDP給第三方應用頒發令牌(Token)來實現以上功能的,第三方應用通過使用令牌向資源服務換取對應的資源。

在Twitter的OAuth指導手冊中說OAuth2是一種認證協議,實際上,這是基于授權的“偽認證”。

OAuth協議的認證過程可以類比為如下流程:Alice要外出一段時間,讓自己的朋友Bob代為照顧她的房子,所以Alice把自己房子的鑰匙交給了Bob,而Bob也就可以任意的進入房子。這里的鑰匙就是一種授權的體現——Alice授權Bob進入房子。在這里例子中,房子的所有者Alice就是用戶,Bob是客戶端,而門鎖就是IDP,房子是資源服務器。

如果假設房子鑰匙的擁有者就是房子的所有者,那么這個授權的過程也是一種偽認證,之所以加一個偽字,是因為
這個假設并不是總是成立的,比如Bob雖然有鑰匙,但是并不是房子的所有者Alice。

更多OAuth的內容,請參見我之前的文章。OAuth2.0 協議入門指南

4. SAML

SAML協議是三者中時間最長的協議,最初版本制定于2001年,并于2005年修改。作為一種安全性斷言標記語言,SAML協議既可以用于認證也用于授權。

所謂的安全性斷言,就是關于認證、授權以及用戶屬性(比如用用戶的有效或者住址等信息)的聲明集合,在SAML中,這些斷言以XML的格式傳輸。

當要驗證一個用戶身份時,服務提供商(Service Provider, SP,即RP,應有依賴方)會向IDP發出SAML認證請求,該請求中會以XML格式說明認證方式的設置,比如希望IDP以何種方式驗證用戶;IDP在認證通過用戶身份之后,會返回SAML請求響應,同樣以XML格式返回斷言表明用戶身份和相關屬性,此外SAML安全性斷言信息必須要使用數字簽名以保證其完整性和不可抵賴性(沒有強制要求對SAML斷言加密);SP接收到SAML斷言之后,驗證其消息來源是否費受信任的IDP,驗證通過之后解析XML獲得認證信息。

除了斷言,SAML還定義了如下概念:

  • 協議(protocols):如何請求和響應斷言信息;
  • 綁定(binding):SP和IDP之間如何通信和傳遞數據;
  • 配置描述(profiles):用來設置斷言、協議和綁定的中所需要使用的變量。

更為詳細的內容請見:

  1. SAML2.0入門指南
  2. OpenSAML 使用引導 I : 簡介——關于OpenSAML你所需知道的一切

5. 協議的對比

以下是三種協議的相關對比和總結,便于讀者根據自己實際情形來選擇下一步要繼續去了解哪一種協議。

對比點 OAuth2 OpenID SMAL
票據格式 JSON or SAML2 JSON XML
支持授權 Yes No Yes
支持認證 “偽認證” Yes Yes
創建年份 2005 2006 2001
最新版本 OAuth2 OpenID Connect SAML 2.0
傳輸方式 HTTP HTTP GET and HTTP POST HTTP重定向,SAML SOAP綁定,HTTP POST綁定等
安全弱點 不能抵抗網絡釣魚,OAuth沒有使用數據簽名和加密等措施,數據安全完全依賴TLS 不能抵抗網絡釣魚,一個釣魚的IDP如果惡意記錄下來用戶的OpenID,將會造成很嚴重的隱私安全問題 XML簽名存在漏洞,可能被偽造
使用場景 API 授權 商用應用的單點登錄 企業級單點登錄,但是對于移動端支持不是很好

6. 深入了解

如果想進一步以上協議的具體,歡迎閱讀我的其他文章:

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

推薦閱讀更多精彩內容