OpenID

**OpenID** 是一個去中心化的網上身分認證系統。對於支援 OpenID 的網站，使用者不需要記住像使用者名稱和密碼這樣的傳統驗證標記。取而代之的是，他們只需要預先在一個作為 OpenID 身分提供者（identity provider, IdP）的網站上註冊。OpenID 是去中心化的，任何網站都可以使用 OpenID 來作為使用者登入的一種方式，任何網站也都可以作為 OpenID 身分提供者。OpenID 既解決了問題而又不需要依賴於中心性的網站來確認數位身分。

## 歷史

OpenID 最初由 LiveJournal 的 Brad Fitzpatrick 開發，後來加入了 Light-Weight Identity，Yadis，Sxip DIX protocol 和 XRI/i-names。未來的 OpenID 規範正在由 OpenID.net 開發，很多技術公司、服務公司和開源開發者都參與其中。

為了推動 OpenID 的應用，2006 年 8 月，一些公司贊助設立了 OpenID 獎勵計劃，對前 10 位滿足要求的軟體專案各獎勵 5000 美元。

2007 年 12 月 5 日，OpenID 驗證規範 9.0 和屬性交換規範 9.0 發布。

## 使用 OpenID

OpenID 相關基本術語：

**終端使用者（End User）** 

　
: 想要向某個網站表明身分的人。

**標識（Identifier）** 

　
: 終端使用者用以標識其身分的 URL 或 XRI。

**身分提供者（Identity Provider, IdP）** 

　
: 提供 OpenID URL 或 XRI 註冊和驗證服務的服務提供者。

**依賴方（Relying Party, RP）** 

　
: 想要對終端使用者的標識進行驗證的網站。

### 登入

一個想要為其存取者提供 OpenID 登入網站，比如 example.com，需要在頁面的某個地方放置一個登入表單。與提示使用者輸入使用者名稱和密碼的傳統登入表單不同的是，這種表單只有一個輸入框：OpenID 標識。網站可以選擇在這個輸入框旁顯示一個小的 OpenID 圖示。這個表單與 OpenID 客戶端庫的實現相連接。

假設使用者 Alice 在身分提供者 openid-provider.org 處註冊了一個 OpenID 標識：alice.openid-provider.org。如果 Alice 想使用這個標識來登入 example.com，她只需要到 example.com 去將 alice.openid-provider.org 填入 OpenID 登入表單。

如果標識是一個 URL，依賴方 example.com 做的第一件事情是將這個 URL 轉換為典型格式：http://alice.openid-provider.org/。在 OpenID 1.0 中，依賴方接著請求該 URL 對應的網頁，然後通過一個 HTML 連結 tag 發現提供者伺服器，比如 http://openid-provider.org/openid-auth.php。同時也確定是否應該使用授權身分（delegated identity）。從 OpenID 2.0 開始，依賴方請求的是 XRDS 文件（也稱為 Yadis 文件），使用內容類型 application/xrds+xml。這種類型在 URL 中可能存在，而在 XRI 中總是存在。

依賴方可以通過兩種模式來與身分提供者通信：

* `checkid_immediate`：兩個伺服器間的所有通信都在後台進行，不提示使用者。
* `checkid_setup`：使用者使用存取依賴方站點的同一個瀏覽器窗口與身分提供者伺服器互動。

第二種模式更加常用。而且，如果操作不能夠自動進行的話，checkid\_immediate 模式會轉換為 checkid\_setup 模式。

首先，依賴方與身分提供者建立一個「共享秘密」—— 一個聯絡控制代碼，然後依賴方儲存它。如果使用 checkid\_setup 模式，依賴方將使用者的網頁瀏覽器重新導向到提供者。在這個例子裡，Alice 的瀏覽器被重新導向到 openid-provider.org，這樣 Alice 能夠向提供者驗證自己。

驗證的方法可能不同，但典型地，OpenID 提供者要求提供密碼（然後可能使用 cookies 儲存使用者對談，就像很多基於密碼驗證的網站的做法一樣）。如果 Alice 當前沒有登入到 openid-provider.org，她可能被提示輸入密碼，然後被問到是否信任依賴方頁面 —— 如 http://example.com/openid-return.php，這個頁面被 example.com 指定為使用者驗證完成後返回的頁面 —— 取得她的身分資訊。如果她給出肯定回答，OpenID 驗證被認為是成功的，瀏覽器被重新導向到被信任的返回頁面。如果 Alice 給出否定回答，瀏覽器仍然會被重新導向，然而，依賴方被告知它的請求被拒絕，所以 example.com 也依此拒絕 Alice 的登入。

但是，登入的過程還沒有結束，因為在這個階段，example.com 不能夠確定收到的資訊是否來自於 openid-provider.org。如果他們之前建立了「共享秘密」，依賴方就可以用它來驗證收到的資訊。這樣一個依賴方被稱為是 stateful 的，因為它儲存了對談間的「共享秘密」。作為對比，stateless 的驗證方必須再作一次背景請求（check\_authentication）來確保資料的確來自 openid-provider.org。

Alice 的標識被驗證之後，她被看作以 alice.openid-provider.org 登入到 example.com。接著，這個站點可以儲存這次對談，或者，如果這是她的第一次登入，提示她輸入一些專門針對 example.com 的資訊，以完成註冊。

OpenID 不提供它自己的驗證方式，但是如果身分提供者使用強驗證，OpenID 可被用於安全事務，比如銀行和電子商務。

## 推廣

OpenID 正在被越來越多的大網站採用。Yahoo! 已經支援 OpenID。所有有 Yahoo 帳戶的使用者可以通過 OpenID directed identity 方式登入支援 OpenID 信賴方網站。

Google 曾經支援 OpenID 2.0，不過自 2015 年 4 月 20 日起，Google 帳戶將不再使用 OpenID，轉而使用 OpenID Connect。

Orange、AOL 與 Yahoo! 都已經支援 OpenID。AOL 提供每個 AOL 或 AIM 的使用者一組 OpenID Identity，目前還在測試階段，為 `openid.aol.com/username`。

目前使用 OpenID 代替一般帳號密碼的網站包括了 著名的開源社群 SourceForge、LiveJournal、Zooomr、Wikitravel、ma.gnolia.com、claimid.com 以及 Jyte。

在 openid.net 上有一份公開的伺服器列表，可以讓一般人申請 OpenID Identity。

## 安全

### 隱蔽重新導向漏洞 (Covert Redirect)

2014 年 5 月，新加坡南洋理工大學一位名叫王晶（Wang Jing）的物理和數學科學學院博士生，發現了 OAuth 和 **OpenID** 開源登入工具的 "隱蔽重新導向漏洞"。

其實漏洞不是出現在 OpenID 這個協定本身，這個協定本身是沒有問題的，之所以存在問題是因為各個廠商沒有嚴格參照官方文件，只是實現了簡版。問題的原因在於 OpenID 的提供方提供 OpenID 授權過程中沒有對回呼的 URL 進行校驗，從而導致可以被賦值為非原定的回呼 URL。

## 中文 OpenID 提供商

* www.CloudID.cn - 支援動態口令，免費
* VIeID.com
* openid.org.cn（頁面存檔備份，存於網際網路檔案館） - 多國語言，免費 - OpenID 格式：http:// 用户名.openid.org.cn/
* 87id（頁面存檔備份，存於網際網路檔案館） - 中英文，免費，支援 IPv6 - OpenID 格式：http:// 用户名.87id.com/
* openid.35.com - 中英文，免費 - OpenID 格式：http://openid.35.com/users/ 用户名 /
* login.comrite.com（頁面存檔備份，存於網際網路檔案館） - 中英文，免費 - OpenID 格式：http://login.comrite.com/ 用户名
* myID.tw（頁面存檔備份，存於網際網路檔案館） - 中文，免費 - OpenID 格式：http:// 用户名.myid.tw/

## 運作方式

## 法律問題

## 參考資料

## 外部連結

* OpenID openid.net（頁面存檔備份，存於網際網路檔案館）
* （簡體中文）OpenID openid.net.cn（頁面存檔備份，存於網際網路檔案館）
* OpenID Source
* OpenID Asia Organization（頁面存檔備份，存於網際網路檔案館）
* （簡體中文）（英文）（日語）（荷蘭文）OpenID wiki
* Directory of OpenID-enabled sites
* OpenID Europe Foundation