我使用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的很多東西我不完全瞭解。因此,我會盡量保留一些可能有助於未來讀者的筆記或「事實」。
- List of OpenID attributes
- 問題:爲什麼所有模式的URL導致404(http://schemas.openid.net/)或奇怪的錯誤(http://axschema.org)?
- 其他問題:我認爲響應模式URL對規範的實現很重要。如果不是,這樣的網址有什麼意義?
- List of some common OpenID provider URLs
傑克,我明白的前兩段,但我得到了與第三一個困惑。我如何「知道」,例如,谷歌支持'http:// axschema.org/namePerson/first'而無需事先做出請求? – Christian
@Christian你不......好吧,我確定他們的文件;但沒關係,你只要求兩種方式使用同一個字段(使用兩種URI方案) - 如果它們都不支持,你可以通過查看斷言來知道一個或兩個字段。 –
所以你說我應該同時要求同一個屬性的兩個URL?另外,你能看到我編輯的問題嗎? – Christian