2012-10-12 56 views
3

我使用OpenID庫LightOpenID讓用戶登錄到他們最喜歡的提供者並將一些信息傳遞給我的系統。OpenID在登錄後獲取數據

隨着LightOpenID這看起來是這樣的:

$openid = new LightOpenID('localhost'); 
if(!$openid->mode) { 
    $openid->identity = 'https://www.google.com/accounts/o8/id'; 
    $openid->required = array(
     'country' => 'contact/country/home', 
     'email' => 'contact/email', 
     'firstname' => 'namePerson/first', 
     'language' => 'pref/language', 
     'lastname' => 'namePerson/last', 
    ); 
    header('Location: ' . $openid->authUrl()); 
} elseif($openid->mode == 'cancel') { 
    echo 'User has canceled authentication!'; 
} else { 
    echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.'; 
    echo '<pre>'.print_r($openid->data, true).'</pre>'; 
} 

通過設置required財產,我能問的OpenID提供商(如谷歌)的一些用戶詳細信息。如果我的研究是正確的,則稱爲「屬性交換」

現在,在這裏我有一些問題(把這個短):

一對夫婦只左右的供應商列出他們所支持的屬性。我想我在這裏錯過了一些東西,認爲供應商列出這些屬性顯然是顯而易見的。無論如何,有沒有辦法通過協議「發現」這些屬性?

2.這是我面臨的主要問題。基本上,我請求的信息(屬性)在用戶成功登錄和批准後傳遞到我的服務器。這很好,很正常 - 除非我的系統執行此操作,否則不會持續存儲此數據。但問題是,我需要得到這個數據一段時間之後,用戶沒有登錄。

如果我不得不與Facebook要做到這一點,它會使用$fb->api('/me');。有趣的是,如果我在用戶登錄時將用戶重定向到登錄頁面,他會將我需要的信息重定向到我的網站。但是這個過程需要在服務器上完成,我想對提供者的簡單CURL請求不會讓我看到這些字段。也許來自原始登錄響應參數的東西可能有幫助?

TL:DR;如何獲得屬性交換字段用戶是否從我身邊登錄而沒有持久存儲?

PS:我使用會話作爲持久存儲;現在我只是存儲openid身份網址,但如果需要,我可以添加更多內容。但是,我不能存儲由openid登錄響應(名稱,姓氏,電子郵件等)給出的所有字段。

其它鏈接/ Notes的

我必須承認有在OpenID的很多東西我不完全瞭解。因此,我會盡量保留一些可能有助於未來讀者的筆記或「事實」。

回答

3

的OpenID不工作的方式,除非它也支持OpenID的OAuth的+,在這種情況下,你可能會做同樣的事情,Facebook的;您只需調用其API以使用您在肯定斷言中給出的訪問令牌來獲取用戶詳細信息。 AX方案非常靈活;你可以使用兩個不同的URI來請求一個字段;一些提供商將支持axschema和其他schema.openid.net

可以通過兩種方式索要電子郵件;只需使用不同的別名即可,例如:

email1 = http://axschema.org/contact/email 
email2 = http://openid.net/schema/contact/internet/email 

這樣您就不必事先知道提供程序支持哪些屬性類型。

編輯

爲什麼所有的模式URI的結果在404?

這是因爲它們不需要實際存在爲文檔,它只是一個約定。

我認爲有響應的模式URL對規範的實現很重要。如果不是,這樣的網址有什麼意義?

OpenID的實施者無法就統一的一組屬性類型達成一致;這對於採用是不利的,因爲可以讀取here

+0

傑克,我明白的前兩段,但我得到了與第三一個困惑。我如何「知道」,例如,谷歌支持'http:// axschema.org/namePerson/first'而無需事先做出請求? – Christian

+0

@Christian你不......好吧,我確定他們的文件;但沒關係,你只要求兩種方式使用同一個字段(使用兩種URI方案) - 如果它們都不支持,你可以通過查看斷言來知道一個或兩個字段。 –

+0

所以你說我應該同時要求同一個屬性的兩個URL?另外,你能看到我編輯的問題嗎? – Christian