2010-06-24 23 views
5

我一直在玩JanRain OpenID PHP庫,主要跟隨a tutorial I found on ZendZone如何在不請求SReg字段的情況下通過OpenID區分/識別用戶?

如何區分用戶 - 尤其是Google用戶,他們最終都使用相同的OpenID URL https://www.google.com/accounts/o8/id

基本上,我可以檢測到他們有一個OpenID帳戶...他們已經成功驗證...但我的應用程序仍然不知道他們是誰;只有他們認證。

爲了區分用戶,本教程使用「簡單註冊請求」來請求用戶的OpenID提供商的電子郵件 - 然後使用電子郵件地址查看這是否是返回用戶。

它不適合我,apparently won't work with some providers所以我很興奮,當我偶然發現一個函數getDisplayIdentifier

require_once "Auth/OpenID/Consumer.php"; 
require_once "Auth/OpenID/FileStore.php"; 
// create file storage area for OpenID data 
$store = new Auth_OpenID_FileStore('/wtv'); 
$consumer = new Auth_OpenID_Consumer($store); 
$oid_response = $consumer->complete("http://example.com/oir_return"); 
if ($oid_response->status == Auth_OpenID_SUCCESS) { 
    $hopefullyUniqueUserID = $oid_response->getDisplayIdentifier(); // I assumed this would be a relatively permanent way to identify the user... 
              // I was wrong. 
} 

不幸的是,幾個小時後getDisplayIdentifier返回的值發生了變化。

+0

請仔細閱讀說明書。 'https:// www.google.com/accounts/o8/id'是用戶提供的標識符,用戶不一定聲稱擁有它,其目的可能只是引導用戶選擇標識符,因爲與谷歌案。 – Artefacto 2010-07-03 11:25:01

回答

1

爲什麼不簡單使用OpenID URL來識別用戶?考慮它獨一無二的電子郵件地址。

+0

我認爲這也是它的工作原理,但他說他正在看到來自同一個OpenID URL的所有Google用戶。 – Rup 2010-07-01 15:51:54

+0

和我一樣,但Google帳戶始終擁有「https://www.google.com/accounts/o8/id 」作爲其網址。 – 2010-07-01 16:01:33

+0

啊,錯過了那部分。 – Echo 2010-07-01 16:25:21

5

跳過代碼,我認爲它是$oid_response->identity_url,你想要的。對我來說(雖然DotNetOpenAuth不是PHP-的OpenID)是回來爲

https://www.google.com/accounts/o8/id?id=AItOawmqjknrgk6f9cNdPIVxW43GewJPa1ZW4GE

從谷歌,其中ID部分是可重複的,希望唯一給我。然而,我還沒有離開它幾個小時,看看這是否會改變,所以,如果這是你已經從getDisplayIdentifier已經有 - 但略讀源代碼看起來它只是使用第一部分,但是我不是PHP專家。

+0

這與'$ oid_response-> getDisplayIdentifier()'給了我什麼一樣的東西,我確實讓它幾個小時了,它改變了:'(儘管如此,我會嘗試。 – 2010-07-01 17:37:18

+0

啊,好吧 - 對不起。 – Rup 2010-07-01 17:43:21

+0

+ 1 - 在幾個小時後檢查;似乎並沒有改變... – 2010-07-02 03:23:44

1

根據下面的最後一段,你一定要使用響應對象的identity_url屬性(當然,這是在參考了Python庫,但實現是非常類似):

顯示標識符與聲明的標識符相關,但兩者並不總是相同的。顯示標識符是 用戶應該識別爲他們輸入的內容,而響應的 聲明的標識符(在L {identity_url}屬性中)可以具有額外的 信息以獲得更好的持久性。

網址將被剝離其片段以供顯示。 XRIs將 顯示人類可讀的標識符(i-name)而不是 持久標識符(i編號)。

在您的用戶界面中使用顯示標識符。使用 L {identity_url}查詢您的數據庫或授權服務器。

來自python-openid docs

相關問題