什么是OpenID? OpenID是一種開放,、離散式的用于用戶數(shù)字標(biāo)識(shí)的開源框架,。 請讓我們思考自己所擁有的在線賬號(hào)種類:博客、wiki,、to-do list,、 個(gè)人相冊。在網(wǎng)絡(luò)應(yīng)用日益充斥的今天,,這些個(gè)人在線賬號(hào)可謂不勝枚舉,,而對(duì)賬號(hào)的需要也同樣無處不在,乃至當(dāng)我們想在好友博客上進(jìn)行評(píng)論時(shí)都需要注冊成為 該博客系統(tǒng)的用戶,。于是作為終端用戶,,我們不得不在每個(gè)網(wǎng)站上設(shè)置賬號(hào),并管理眾多的賬號(hào),。而采用OpenID技術(shù)的話,,你就無須再管理這些相互獨(dú)立的帳 號(hào),,而是通過認(rèn)證服務(wù)器管理自己唯一的身份標(biāo)識(shí)。 OpenID常見的應(yīng)用場景:某用戶試圖登錄一個(gè)外部網(wǎng)站,。與提交用戶名和密碼的方式不同,他只提交了屬于自己的一個(gè)URL,,例如:http://johnsmith./ 這 個(gè)URL即指向了用戶的OpenID認(rèn)證服務(wù)器,,同時(shí)又是用戶的身份標(biāo)識(shí)。因此外部網(wǎng)站使用此URL便可以找到用戶的認(rèn)證服務(wù)器,,并詢問認(rèn)證服務(wù)器:“該 用戶聲稱他擁有此URL,。而這個(gè)URL說明了你負(fù)責(zé)認(rèn)證工作,那么請告訴我,,該用戶能否訪問我的站點(diǎn),?”。認(rèn)證服務(wù)器將提示用戶登入認(rèn)證系統(tǒng),,并詢問用戶 是否允許和外部網(wǎng)站進(jìn)行認(rèn)證,。如果用戶同意的話,那么認(rèn)證服務(wù)器將通知外部網(wǎng)站——用戶已經(jīng)通過認(rèn)證,。在上面,,我們通過擬人化的表達(dá)方式來形象生動(dòng)地詮釋 整個(gè)認(rèn)證請求/回應(yīng)過程。 用戶可以使用同一個(gè)URL用作在任何支持OpenID認(rèn)證的外部網(wǎng)站中使用的標(biāo)識(shí),。這正是OpenID與其它傳 統(tǒng)認(rèn)證方式的最大不同,。通過使用URL,可以使外部站點(diǎn)非常容易地獲取到負(fù)責(zé)認(rèn)證工作的服務(wù)器位置,。而只有認(rèn)證服務(wù)器才需要輸入密碼來驗(yàn)證用戶身份,。其它 希望驗(yàn)證用戶身份的站點(diǎn)都將詢問用戶所注冊的認(rèn)證服務(wù)器。如果你正在使用支持OpenID的門戶站點(diǎn)(比如AOL),,那么你就可以使用現(xiàn)成的AOL即時(shí)消 息登錄賬號(hào)來登錄AOL站點(diǎn),,而無需另外注冊。因此,,我們可以猜想Google和Yahoo也許已經(jīng)開始著手建造他們的OpenID服務(wù),。 你一定想知道OpenID是如何實(shí)現(xiàn)分散化服務(wù)的?由于用戶具有選擇OpenID服務(wù)提供者的權(quán)利,,因此你會(huì)在最初選擇AOL作為OpenID提供者,,而過一段時(shí)間后,可能覺得希望更換到另外一個(gè)OpenID提供者,,此時(shí)你所需要做的就是修改以下的HTML標(biāo)簽: <link rel="openid.server" href="http://openid./"> 保存這些link元數(shù)據(jù)的最常見位置就是個(gè)人站點(diǎn)(比如博客)的根頁面,。 如何使用OpenID? OpenID 絕妙地解決了多個(gè)賬號(hào)同步問題,但并不僅僅如此,。例如,,你可以利用它建立跨應(yīng)用,、跨域的單點(diǎn)登錄(Single sign-on)。如果你使用同一個(gè)OpenID登入了博客和個(gè)人相冊,,那么你只需要在登錄過程中進(jìn)行一次認(rèn)證,。對(duì)于在此之后的每個(gè)需要登錄的應(yīng)用(在同 一個(gè)session周期)只需提供OpenID,而不是傳統(tǒng)的用戶名和密碼,。 大多數(shù)OpenID提供者也提供了支持多個(gè)配置的功能,。這樣 你就可以使用“Bob Smith”登錄博客,而使用“Robert J Smith”登錄企業(yè)wiki,。隨著OpenID提供者的日益成熟和OpenID功能上的提升,,我們不久就會(huì)使用對(duì)來自伙伴公司OpenID認(rèn)證服務(wù)器主 機(jī)名的用戶進(jìn)行認(rèn)證的服務(wù)。 哪些網(wǎng)站支持OpenID? OpenID技術(shù)出現(xiàn)不久,,便獲得了在眾多公共消費(fèi)站點(diǎn)的熱捧:Digg,、Six Apart、Zoomr和AOL,。 其中AOL為老用戶提供了OpenID支持,,使得六千五百萬的登錄用戶在一日之內(nèi)就全部能夠使用OpenID。目前已經(jīng)具有超過九千五百萬的用戶能夠使用 OpenID登錄系統(tǒng),,并且每天都有25至50個(gè)站點(diǎn)加入到支持OpenID規(guī)范的隊(duì)伍中,。另外,OpenID增加了對(duì)Firefox3和微軟 Windows Vista的支持,。 下面是實(shí)現(xiàn)了OpenID代碼庫的語言列表: ? C# ? C++ ? Java ? Perl ? Python ? Ruby ? PHP ? Coldfusion OpenID社區(qū)維護(hù)了這些代碼庫的清單:http:///wiki/index.php/Libraries,。在本文的后面,我們將討論到OpenID的Java實(shí)現(xiàn):OpenID4Java(http://www.),。 OpenID協(xié)議綜述 OpenID協(xié)議非常易于擴(kuò)展,,下面的圖表展示了OpenID2.0草案的基本工作流程。它展示了在終端用戶,、Relying Party站點(diǎn)(一個(gè)示例站點(diǎn))和OpenID服務(wù)提供者之間的交互過程(最常見的認(rèn)證流程),。 用戶登入外部站點(diǎn)的過程主要分為以下七個(gè)步驟: 1. Relying Party站點(diǎn)請求用戶標(biāo)識(shí) 此步驟非常簡單:用戶提供一個(gè)字符串(以URL或者XRI格式)給外部站點(diǎn),使后者能夠識(shí)別用戶,。 1. 外部站點(diǎn)請求用戶發(fā)送標(biāo)識(shí),。通常使用帶有Open圖標(biāo)的文本輸入框、用于提交信息的按鈕組成的form來完成此功能,。為了方便起見,,文本輸入框的name 屬性應(yīng)為openid_identifier,這樣以便瀏覽器自動(dòng)將其識(shí)別為一個(gè)OpenID登錄form,。 2.用戶輸入標(biāo)識(shí),,標(biāo)識(shí)可能采用下面的形式: ? URI/URL (通過http或者h(yuǎn)ttps) ? XRI。XRI是一種廣義的,、分散式的URI,。它能用于任何使用URI的地方,。XRI主要采用以下形式:xri://authority/path?query#fragment。了解更多關(guān)于XRI的信息請看:XRI語法規(guī)范,。 用戶標(biāo)識(shí)類似這個(gè)樣子:http://myname./,。外部站點(diǎn)經(jīng)常將OpenID logo放置到其登錄form上,這樣可以使你很快地辨別出是否使用OpenID,。 用戶在點(diǎn)擊位于外部站點(diǎn)登錄頁面上的“Login”按鈕后便啟動(dòng)了認(rèn)證過程,。 2.“標(biāo)準(zhǔn)化”: Relying Party站點(diǎn)整理用戶標(biāo)識(shí) 用戶輸入了標(biāo)識(shí)后,此標(biāo)識(shí)便由外部站點(diǎn)進(jìn)行整理(標(biāo)準(zhǔn)化),。由于標(biāo)識(shí)可能使用XRI或者URI格式,,因此整理的過程非常復(fù)雜: 1.如果標(biāo)識(shí)以xri://,、xri://$ip或者xri://$dns*開頭,,那么我們要去掉這些頭部標(biāo)記。 2. 如果余下字符串中的第一個(gè)字符是XRI的全局上下文符號(hào)(=,、@,、+、 $,、!),,那么此字符串為標(biāo)準(zhǔn)的XRI標(biāo)識(shí)。否則,,將被視為HTTP URL(如果http/https前綴沒有定義,,我們需要為其添加上http://)。當(dāng)然,,URL必須遵守URL命名規(guī)范,。最終獲得的URL就是一個(gè)標(biāo) 準(zhǔn)的URL標(biāo)識(shí)。 下面是一些示例: 下面的流程圖描繪了標(biāo)準(zhǔn)化處理過程: 3.“發(fā)現(xiàn)”: Relying Party站點(diǎn)查詢與OpenID服務(wù)器進(jìn)行通訊的方式 外部站點(diǎn)使用標(biāo)準(zhǔn)化的標(biāo)識(shí)來查詢用于發(fā)起請求所必須的信息,。對(duì)于“發(fā)現(xiàn)”階段來講,,其使用的解析協(xié)議和獲取的結(jié)果文檔都取決于在標(biāo)準(zhǔn)化階段決定的標(biāo)識(shí)類型。這正是OpenID2.0規(guī)范的特殊之處,。 快速參考: ? XRI 解析:類似通過UDP將主機(jī)名解析為IP的DNS協(xié)議,;它將XRI轉(zhuǎn)換為XRDS。其目的是提供一種將厚重,、通用的XRI格式轉(zhuǎn)換為真實(shí)可用的描述符,。 ? YADIS協(xié)議:將URL連接到XRDS上。這是一種非常簡單的協(xié)議,,它將當(dāng)前的HTTP或者HTTPS URL直接指向XRDS,。 ? XRDS:一種基于XML的XRI資源描述符。它被設(shè)計(jì)用來提供關(guān)于XRI的可用的,、描述性信息,。在OpenID應(yīng)用場合中,,XRDS用來描述 OpenID服務(wù)器,并且使用“priority”參數(shù)標(biāo)識(shí)了用戶對(duì)服務(wù)器的優(yōu)選順序,。在下面的示例中,,http: //www./users/frank具有最高的優(yōu)先權(quán)(最低的數(shù)值): <?xml version="1.0" encoding="UTF-8"?> ? 使用HTML代碼。在HTML的<head>部分必須提供以下標(biāo)簽: <link rel="openid2.provider" href="http:///server/endpoint/url"/> 可選的,,如果用戶使用委派(delegation)(就是用戶宣稱擁有一個(gè)不存在于該OpenID服務(wù)器上的本地標(biāo)識(shí)),,則需要使用下面的標(biāo)簽: <link rel="openid2.local_id" href="http:///server/endpoint/url"/> 例如,某人正在使用openidprovider.com這個(gè)OpenID服務(wù)器來驗(yàn)證他在另一個(gè)OpenID服務(wù)器usersite.com上的身份,,那么其本地標(biāo)識(shí)將使用類似user.openidprovider.com的形式,。 這個(gè)“發(fā)現(xiàn)”的過程允許外部站點(diǎn)知道兩件事,其中一件是外部站點(diǎn)如何與OpenID服務(wù)器進(jìn)行通訊: 1.OpenID提供者端點(diǎn)URL:OpenID提供者的最終URL(服務(wù)器URL),。 2.認(rèn)證協(xié)議版本: OpenID認(rèn)證使用的協(xié)議版本,。 作為可選的,如果用戶使用委派,,那么外部站點(diǎn)將需要知道: 1.用戶宣稱的標(biāo)識(shí):此標(biāo)識(shí)為用戶宣稱屬于自己的,。它是在登錄過程中用戶提供過的標(biāo)識(shí)。 2.本地標(biāo)識(shí)(OP-Local Identifier):用戶在其OpenID服務(wù)器上擁有的本地標(biāo)識(shí),。 例 如,,用戶使用http://www./作為其標(biāo)識(shí),但外部網(wǎng)站實(shí)際上通過https: //www./endpoint/這個(gè)OpenID服務(wù)器來驗(yàn)證用戶標(biāo)識(shí)https: //exampleuser./,。那么在對(duì)http://www./執(zhí)行發(fā)現(xiàn)的過程中,,我 們需要在XRDS文檔的最后一個(gè)XRD成員中提供下面的XML片段 <Service xmlns="xri://$xrd*($v*2.0)"> 4. Relying Party站點(diǎn)建立與OpenID服務(wù)器之間的關(guān)聯(lián)(可選) 通過在外部站點(diǎn)和OpenID服務(wù)器之間的關(guān)聯(lián)(association),我們可以建立一種在兩者之間共享的加密通道,,它可以用來驗(yàn)證后續(xù)的協(xié)議信息并降低通訊回合數(shù),。在OpenID規(guī)范中對(duì)于實(shí)際創(chuàng)建關(guān)聯(lián)的過程進(jìn)行了詳盡的描述。簡單來講就是使用了一種Diffie-Hellman密鑰交換算法來生成共享密鑰,。此密鑰用于對(duì)信息進(jìn)行簽名,。 這 樣使得外部站點(diǎn)和OpenID服務(wù)器之間能夠安全地通訊。這里指的“安全性”是通過傳輸層(使用SSL)或者通過應(yīng)用層的HMAC SHA1或者HMAC SHA256算法實(shí)現(xiàn)的,。關(guān)聯(lián)請求的成果就是assoc_handle(關(guān)聯(lián)權(quán)柄),,外部站點(diǎn)和OpenID服務(wù)器將在本次關(guān)聯(lián)的后繼活動(dòng)中將它作為對(duì)消 息進(jìn)行加密的密鑰。 關(guān)聯(lián)階段被標(biāo)為“可選的”,,這是因?yàn)镺penID協(xié)議還允許外部站點(diǎn)直接請求認(rèn)證(不作關(guān)聯(lián)),、并且接著請求對(duì)認(rèn)證信 息進(jìn)行驗(yàn)證。這樣外部站點(diǎn)可以不保有關(guān)聯(lián)權(quán)柄信息,,以實(shí)現(xiàn)無狀態(tài)通訊,。而這種方式被推薦用于執(zhí)行與OpenID服務(wù)器之間的相關(guān)通訊,但如果不能使用此方 式的話,就必須創(chuàng)建上面講的關(guān)聯(lián)方式,。 5. Relying Party站點(diǎn)請求認(rèn)證 我們通過使用重定向頁面可以建立認(rèn)證請求,。請查看下表中的重要參數(shù)值,詳細(xì)信息請參考OpenID相關(guān)信息格式文檔: 請注意:外部站點(diǎn)并沒有直接發(fā)送HTTP請求到OpenID服務(wù)器,,而是重定向到OpenID服務(wù)器頁面,。由于這樣使得OpenID服務(wù)器能夠從用戶瀏覽器中讀取cookie而沒有將任何認(rèn)證細(xì)節(jié)泄露給外部站點(diǎn),因此這個(gè)過程是安全的,。 6. OpenID服務(wù)器回應(yīng)認(rèn)證請求 在接收到OpenID認(rèn)證請求后,,OpenID服務(wù)器必須決定允許還是拒絕此用戶的認(rèn)證。這將由用戶從前是否在OpenID服務(wù)器上認(rèn)證過決定,。 請注意:OpenID服務(wù)器在接收認(rèn)證請求信息時(shí)是具有控制權(quán)的,。這意味著它不但能夠異步地回應(yīng)認(rèn)證請求信息,并在它回應(yīng)認(rèn)證請求之前與用戶進(jìn)行一系列的交互,。大多數(shù)認(rèn)證服務(wù)器都提供給用戶一個(gè)頁面使其能夠選擇允許或者拒絕來自外部站點(diǎn)的認(rèn)證請求,。 一旦OpenID服務(wù)器已經(jīng)回應(yīng)了認(rèn)證請求,那么它將創(chuàng)建一個(gè)如下描述的認(rèn)證回應(yīng)信息,,低層信息細(xì)節(jié)請閱讀OpenID協(xié)議文檔: 此回應(yīng)通過將用戶重定向到外部站點(diǎn)的方式發(fā)送,,以確保外部站點(diǎn)和OpenID服務(wù)器之間在認(rèn)證請求/回應(yīng)過程中沒有直接通訊,。 7. 驗(yàn)證間接回應(yīng) 協(xié)議的最后一步是外部站點(diǎn)驗(yàn)證這個(gè)發(fā)自O(shè)penID服務(wù)器的間接認(rèn)證回應(yīng)信息,。 當(dāng)外部站點(diǎn)接收到回應(yīng)時(shí),它必須在接受其內(nèi)容之前進(jìn)行下面的驗(yàn)證: ? “openid.return_to”的參數(shù)值是否匹配當(dāng)前請求的URL,。這確保OpenID服務(wù)器重定向用戶,、發(fā)送回應(yīng)信息到正確的URL。 ? 被發(fā)現(xiàn)的信息是否與回應(yīng)信息相匹配,。 ? 具有相同參數(shù)值的“openid.response_nonce”表示OpenID服務(wù)器遭到了重放攻擊(reply attacks),。 ? 在回應(yīng)信息中的簽名是否有效、要求的簽名域是否都被簽名,。這保證認(rèn)證信息沒有被篡改過,。 協(xié)議擴(kuò)展 OpenID協(xié)議提供了一個(gè)基本的認(rèn)證機(jī)制。目前還有基于OpenID的其它可用協(xié)議: ? Attribute Exchange:OpenID屬性交換是一種用于在端點(diǎn)之間交換標(biāo)識(shí)信息OpenID服務(wù)擴(kuò)展,。其提供了對(duì)標(biāo)識(shí)信息的接收和存儲(chǔ),。 ? Simple Registration:這是OpenID認(rèn)證協(xié)議的擴(kuò)展,它允許非常輕量級(jí)的配置交換,。主要用于在終端用戶使用web服務(wù)注冊新賬號(hào)時(shí)傳送八種常用的請求信息,。 使用OpenID4Java實(shí)現(xiàn)OpenID協(xié)議 OpenID4Java是對(duì)OpenID1.1和2.0規(guī)范的實(shí)現(xiàn),目前它通過code.google.com系統(tǒng)進(jìn)行維護(hù),。此項(xiàng)目初始代碼是由Sxip捐獻(xiàn)出來的,,而后Atlassian等公司參與進(jìn)來,并為實(shí)現(xiàn)支持2.0規(guī)范(屬性交換規(guī)范)的API貢獻(xiàn)了大量的工作。 在使用OpenID4Java之前,,你需要完成以下工作: ? 下載OpenID4Java代碼庫,,并將其安裝到你的項(xiàng)目中。 ? 修改你的認(rèn)證提示,,使其詢問用戶的OpenID標(biāo)識(shí),,而不是從前的用戶名和密碼。 ? 創(chuàng)建針對(duì)用戶標(biāo)識(shí)的認(rèn)證請求,,并將用戶重定向到他們的OpenID服務(wù)器,。 ? 在返回URL中接收OpenID提供者的認(rèn)證回應(yīng)并進(jìn)行驗(yàn)證。 這樣,,你的web應(yīng)用就會(huì)像在上面協(xié)議綜述中的流程圖所展示的“Relying Party”那樣工作,。 第一步是創(chuàng)建消費(fèi)者對(duì)象,它將向認(rèn)證服務(wù)器發(fā)出認(rèn)證請求,。這里我們將消費(fèi)者對(duì)象視為一個(gè)貫穿應(yīng)用的個(gè)體,,以使相關(guān)的關(guān)聯(lián)密鑰能夠保存在同一位置。因?yàn)楫?dāng)面臨多個(gè)認(rèn)證請求時(shí),,在不同的請求之間保存密鑰將在兩個(gè)端點(diǎn)(請求和回應(yīng)端點(diǎn))間引起下幅度的性能下降,。 Sample Consumer代碼片段: /** 一旦用戶提供了OpenID URL,你就需要獲取OpenID認(rèn)證服務(wù)器的端點(diǎn)URL,,發(fā)送請求到此URL,。而OpenID認(rèn)證服務(wù)器的端點(diǎn)被確定后,你還要?jiǎng)?chuàng)建一個(gè)和服務(wù)器關(guān)聯(lián)的共享密鑰,。 // discover the OpenID authentication server‘s endpoint URL 以上的調(diào)用將完成: ? 下載OpenID提供者列表(一般只有一個(gè)提供者),。返回結(jié)果將按照用戶指定的優(yōu)選順序排列。 ? 通過關(guān)聯(lián)獲取和OpenID提供者之間的共享密鑰,。 ? 將關(guān)聯(lián)(發(fā)現(xiàn)信息)保存,,以備之后的使用。 我們現(xiàn)在需要將用戶重定向到他們的OpenID提供者頁面,,并告訴OpenID提供者外部站點(diǎn)的地址(返回URL,,這里就是你的站點(diǎn)),以使OpenID提供者知道在執(zhí)行完認(rèn)證后將用戶發(fā)送到哪里,。 // define the return path 上 面的代碼將用戶重定向到他們的OpenID提供者,,在那里用戶將被詢問是否同意和你的站點(diǎn)進(jìn)行認(rèn)證。(請注意:無論用戶同意“臨時(shí)”授權(quán)給你的web應(yīng) 用,、還是“總是”或者“不”授權(quán),,OpenID提供者都將保存此首選標(biāo)識(shí))。當(dāng)用戶再次訪問你的web應(yīng)用時(shí),,如果用戶已經(jīng)被OpenID提供者認(rèn)證過并 且在首次認(rèn)證時(shí)選擇了“總是”,,那么此用戶將可以訪問你的web應(yīng)用,,而無需再次認(rèn)證。 在認(rèn)證用戶之后,,OpenID提供者將用戶重定向到外部站點(diǎn)(由返回URL定義的web應(yīng)用),,并發(fā)送認(rèn)證回應(yīng)信息給你的web應(yīng)用,而你的web應(yīng)用將需要接收此回應(yīng),。你可以顯示錯(cuò)誤信息或者將用戶發(fā)送到“成功”頁面,,這完全取決于你的工作流。 這是處理來自O(shè)penID提供者認(rèn)證信息的最簡單過程: // extract the parameters from the authentication response 查看完整的Sample Consumer代碼:http://code.google.com/p/openid4java/wiki/SampleConsumer 結(jié)論 OpenID是通過標(biāo)準(zhǔn)化認(rèn)證方式由互聯(lián)網(wǎng)社區(qū)催生出來的綜合效應(yīng),。它完成了和SAML這些現(xiàn)存協(xié)議同樣的事情,,但它卻易于安裝、部署和維護(hù),。任何具備基本編程技能的人都能夠在其現(xiàn)有或者新建的網(wǎng)站上部署OpenID技術(shù),。 OpenID已經(jīng)獲得愈加廣泛的使用。我們有理由相信,,在不久之后的公司之間,、像Google和Yahoo這樣的門戶站點(diǎn)之間都將支持此技術(shù),OpenID技術(shù)將隨著互聯(lián)網(wǎng)社區(qū)的發(fā)展而成為網(wǎng)站之間通用的主流認(rèn)證方法,。 關(guān)于OpenID技術(shù)的更多信息,,請?jiān)L問:http:/// 原文(《Using OpenID》)作者簡介 Justen Stepka是Atlassian的Crowd單點(diǎn)登錄安全系統(tǒng)的項(xiàng)目管理者,同時(shí)也是OpenID4Java項(xiàng)目的提交者(committer),。Crowd團(tuán)隊(duì)目前正在開發(fā)實(shí)現(xiàn)OpenID2.0規(guī)范的服務(wù)站點(diǎn),。Justen從前是Authentisoft的CEO,該公司于2006年被Atlassian收購,。 Shihab Hamid是在Atlassian工作的工程師,,他主要負(fù)責(zé)用Crowd產(chǎn)品在OpenID集成方面的設(shè)計(jì)和開發(fā),。同時(shí)也是OpenID4Java項(xiàng)目的提交者,。 |
|