2011-11-18 99 views
6

我想實現一個最新的LightOpenID版本的OpenID登錄系統。我正在逐行測試源代碼提供的示例(我剛剛在構造函數中將localhost替換爲$_SERVER['HTTP_HOST'])。OpenID登錄代碼在現場服務器中失敗

問題是,我的開發箱內的專用網絡(Windows Vista上的PHP/5.3.6)的一切工作正常,但在我的生活服務器在HSP公共網絡驗證總是失敗(CentOS上的PHP/5.3.3 )。

我已經添加了var_dump()的全部內容,我可以告訴你,這兩個代碼副本產生完全相同的請求參數,並接收完全相同的響應參數(通過GET)。只有openid.assoc_handle,openid.sig,openid.response_nonceopenid.return_to有不同的值,我猜是預期的行爲。

然而,我的dev的盒子從OpenID提供商接收到這個(不管我用哪一個):

is_valid:true 
ns:http://specs.openid.net/auth/2.0 

...和我的活狐狸收到這樣的:

is_valid:false 
ns:http://specs.openid.net/auth/2.0 

有AREN不涉及任何非ASCII字符,因此它不能成爲編碼問題。我的託管服務一定有問題,但我無法弄清楚。

我需要關於可能的原因和故障排除提示的建議。

回答

11

我已經隔離了問題並找到了解決方法。該request()方法使得一些自動檢測,以瞭解如何囑咐HTTP連接:

protected function request($url, $method='GET', $params=array(), $update_claimed_id=false) 
{ 
    if (function_exists('curl_init') 
     && (!in_array('https', stream_get_wrappers()) || !ini_get('safe_mode') && !ini_get('open_basedir')) 
    ) { 
     return $this->request_curl($url, $method, $params, $update_claimed_id); 
    } 
    return $this->request_streams($url, $method, $params, $update_claimed_id); 
} 

在我的dev的盒子是使用捲曲,但在我活的盒子,它使用file_get_contents()因爲檢查失敗。原因是open_basedir指令不是空的。

如果我強制LightOpenID使用CURL,一切運行順利。


更新#1:確定是捲曲時 LightOpenID是正確的是無法使用。我發現這個日誌文件:

當safe_mode設置爲啓用 或open_basedir的設置

對於file_get_contents()版本CURLOPT_FOLLOWLOCATION無法啓動,我懷疑我發現一個錯字在庫:

Index: lightopenid/openid.php 
=================================================================== 
--- lightopenid/openid.php (0.60) 
+++ lightopenid/openid.php (working copy) 
@@ -349,7 +349,7 @@ 
      $this->headers = $this->parse_header_array($http_response_header, $update_claimed_id); 
     } 

-  return file_get_contents($url, false, $context); 
+  return $data; 
    } 

    protected function request($url, $method='GET', $params=array(), $update_claimed_id=false) 

我已通知作者,他確認這是一個錯誤。如果問題得到解決,我會報告。

更新#2:於2012年6月在主分支的錯誤was fixed它仍然不是穩定版本的一部分,但可以從code repository下載。

+0

感謝您的修復。雖然重複,但我想知道爲什麼第二次調用file_get_contents($ url,false,$ context)等於$ data不起作用? – neobie

+2

我想你只能出於安全原因才能成功地驗證一個呼叫。 –

+0

由於某種原因,它被稱爲「隨機數」。這是一次性的令牌。 – Maerlyn

0

只是在黑暗中拍攝的,但是當我使用OpenID(而不是lightopenid)而是用於CodeIgniter的庫時,我的權限未正確設置爲nonce緩存文件夾時出現類似問題。也許它是一個簡單的存儲權限問題?

+0

據我所知,LightOpenID不使用存儲。但是我發現了一個區別:實時服務器似乎沒有CURL可用,而LightOpenID使用'file_get_contents()'代替。我會試着找出它是否相關。 –

相關問題