淺談 OpenID

OpenID

約略說一下。

是一套開放的分散式認證系統。傳統中央化的驗證系統,使用者的資料,例如用戶名稱,密碼等等也是存放到跟應用程式同一個地方,用戶如果要到另一個網站登入,便必須再註冊另一個帳戶,非常不方便。現在互聯網大部份網站便是如此。

於是有人想到了單次登入(Single Sign-On, SSO) 這個構思。最普及的單次登入系統非微軟的 Passport (Windows Live ID) 莫屬。只需要一組帳戶,登入後即可使用所有微軟的服務,好像 Spaces,Messenger,Mail 等等。Yahoo! 跟 Google 也有類似系統,不過這些現成系統的缺點還是他們之間不能共通:你不可以拿 Google 的帳戶登入 Yahoo! 的服務。同樣,登入了 Yahoo! 網站到 Microsoft 的網站還得要輸入 Live ID 這邊的帳戶名稱及密碼,還是夠麻煩的。

所以才會有 OpenID 的出現。OpenID 的儲存帳戶的地方(身份伺服器)是分散的:在這個系統裏,每個人也可以有自己的伺服器儲存自己的用戶資料,不再只限於服務提供者。一個 OpenID 帳戶的擁有人如果要登入某個支援 OpenID 的網站,步驟如以下這樣:(我們把 A 當成服務提供者,B 是認證伺服器,C 則是帳戶擁有者)

  1. C 要登入網站 A,提供了一個由 C 自己擁有(或由 B 提供) 的 URL 給 A。
  2. A 透過那條 URL 提供的資料找到 B。這時候 A 會把用戶 C 轉址到 B 的登入頁面。
  3. C 輸入了自己的個人密碼給 B。確認正確無誤,B 把驗證資料傳回 A,C 也會被導回至網站 A。
  4. 這時候 A 會再跟 B 核對剛才傳過來的驗證資料。
  5. 如無大礙,C 便算是成功登入,這時候也許 A 會再跟 C 提供更多註冊資料。

這種做法好處在於:

  1. 使用者不用再到處註冊帳戶或登入,一個 URL,世界通行。
  2. 使用者可以完全控制自己的個人資料,第三者網站(網站 A) 絕不可能得到使用者的密碼。使用者也可以限制第三者網站可以獲得哪些個人資訊。
  3. 打擊冒名留言。在社交網絡上,很多時候使用者(特別是知名的)也會被破壞份子冒名惡意中傷。如果網站留言系統使用了 OpenID,由於每位使用者也會有自己獨一無二的 URL 識別,分辨冒名者和正牌貨變得容易許多。

不過 OpenID 並不是解決所有帳戶問題的靈丹妙藥。例如它不能防止廣告機器人註冊帳戶(雖然暫時還沒看見有這樣的 Robot),也不可以制止使用者使用多個帳戶自問自答(OpenID 是設計成大家可以擁有多個帳戶的)。因為 OpenID 是方便和保障使用者的工具,網站運作者必需透過其他方法保護自己的網站免受侵害。

另外,有些人擔心 OpenID 會成為網絡釣魚者的天堂。只要惡意網站在要求 OpenID 登入時將使用者重導至一個偽造的身份伺服器,向使用者要求帳戶名稱及密碼,即可登入該帳戶擁有的全部服務。不過這個問題基本上跟現時網絡上出現的偽造網站的方法同出一徹,只要使用者細心留意導向的身份伺服器網址是否正確,即可避免帳戶被盜取的問題。(切記:網站絕不會向你同時索取 OpenID URL 跟密碼。在同一頁面請你打 URL 和密碼的,一定是釣魚網站)

OpenID 自推出以來即獲得不少業界支持,表態支持的有 AOL,VeriSign,Microsoft,Zoomr以及 LiveJournal。其中 AOL,Zoomr 及 LJ 均接受以 OpenID 開設新帳戶,Microsoft 則計劃將 OpenID 與其 CardSpace 技術融合(會不會是 EEE 呢?)。WordPress.com 也提供 OpenID 身份伺服器,可是留言不支援 OpenID 卻真的叫人摸不著頭腦。

怎樣擁有自己的 OpenID?方法有很多,不過簡單來說是這樣:

  1. 到其中一個 OpenID 供應商申請一個 OpenID,或自己架一個 OpenID 伺服器。(我是自己架一個的)
  2. 將以下兩句加到你的個人網址首頁的 HTML <head> 部份:
    
    

這兩句的內容因人而異,不過大部份供應商也會在你申請後告訴你。openid.delegate href URL 即是 OpenID 供應商提供給你的網址,openid.server 的 URL 可以到那個 URL,找一下源碼再複製過來 。只要設定好以後,你便可以使用自己的個人網址為帳戶名稱。我的 OpenID URL 便是 mk.netgenes.org。

下一篇說說 WordPress 支援 OpenID 的方法和技巧。

延伸閱讀:

Leave a Reply

Your email address will not be published. Required fields are marked *