2011-11-18 24 views
1

我正在實施基於OpenID的登錄系統,其登錄系統爲LightOpenID。繼documentation,我用的是$openid->identity屬性來設置和獲取用戶提供的身份:)調用authUrl(前與代表團使用OpenID時,Yahoo返回不同的身份URL

將其設置和驗證後得到()。

所以我如下:

<?php 

$openid = new OpenID; 

if(!$openid->mode){ 
    if(isset($_POST['openid'])){ 
     // Auth required 
     $openid->identity = $_POST['openid']; 
     header('Location: ' . $this->authUrl()); 
     exit; 
    } 

}elseif($openid->mode == 'cancel'){ 
    // Cancelled by user 

}else{ 
    if($this->validate()){ 
     // Sucess 
     $user = $openid->identity; 
    }else{ 
     // Error 
    } 
} 

當我測試系統代表團(我相信這是技術名稱:我在登錄框中鍵入我的域名,並用獲取認證第三方提供商)所產生的身份並不總是我最初輸入的身份,這種行爲似乎取決於幕後的提供商。更具體地說,如果我輸入http://example.com/雅虎將始終返回https://me.yahoo.com/XXXXXXXXXX#5ab6d,其中XXXXXXXXXX是我的雅虎用戶名。其結果是,我不能可靠地識別用戶的重複:一旦他們更換供應商,他們會失去我的網站的帳戶信息:

["openid_claimed_id"] => string(37) "https://me.yahoo.com/XXXXXXXXXX#5ab6d" 
["openid_identity"] => string(31) "https://me.yahoo.com/XXXXXXXXXX" 

我的問題:

  • 這種行爲正確?
  • 我的代碼錯了嗎?

(如果我濫用的任何條款。周圍的一切的OpenID趨於overcomplication,尤指術語,請大家指正。)

回答

2

據我知道這是不是在正確的行爲供應商的一部分。

雅虎(和美國在線,順便說一下)就是這麼做的。解決這個問題的唯一方法是開始使用不同的提供者。

至於你的第二個問題,你的代碼是正確的。請記住,認證狀態不會自動記住,並且您必須自己將其存儲在會話中(當然,如果您希望它在請求之間保留)。

+0

哦,我的......我不知道是否有一個單一的OpenID提供商那裏實際上工作:(謝謝你的提示。順便說一句,我的代碼的其餘部分基本上完成;我只被卡在這種OpenID微妙之處。 –