2011-04-05 103 views
3

問題我試圖讓LightOpenID與Google Apps企業版帳戶一起使用。我得到「找不到服務器!」當我調用validate()。我嘲笑了一個快速頁面來測試LightOpenID的每一步,並且我得到了更遠一點,現在總是得到「is_valid:false」。最後一步的OpenID驗證,總是返回「is_valid:false」

我已經這樣做了遠東 在通過驗證工作(),並探索線()行,我注意到,某些openid->數據[](認爲「openid_ *」)值並沒有使它到最後的參數數組(認爲「openid。*」),所以在我的例子中,我明確地編碼了它們。 我不知道我是否總是得到is_valid:false,因爲我缺少一個openid。 東西的價值,或者如果因爲OpenID說提供者只應該驗證每個nonce一次或別的東西。

你如何幫助我如果你已經得到這麼多,我可以使用兩件事情之一。要麼在我的示例代碼中指出錯誤,要麼給我一個你用來測試這種事情的過程。每次我想測試驗證/驗證步驟時,是否真的必須註銷/返回?有什麼工具或流程可以加速這種修補嗎?

示例代碼我用example.com替換了我的域。讓我知道你是否想要任何輸出。 謝謝,埃裏克B.

try { 
    $openid = new LightOpenID; 
    if(!$openid->mode) { 
     if(isset($_GET['login'])) { 
      //$openid->identity = 'https://www.google.com/accounts/o8/id'; 
      $openid->identity = 'https://www.google.com/accounts/o8/site-xrds?hd=example.com'; 
      header('Location: ' . $openid->authUrl()); 
     } 
?> 
<form action="?login" method="post"> 
    <button>Login with Google</button> 
</form> 
<?php 
    } elseif($openid->mode == 'cancel') { 
     echo 'User has canceled authentication!'; 
    } else { 
$tClaimedID = 'https://www.google.com/a/example.com/o8/ud?be=o8'; 
$openid->data['openid_claimed_id'] = $tClaimedID; 

foreach (explode(',',$openid->data['openid_signed']) as $item) { 
    $value = $openid->data['openid_'.str_replace('.','_',$item)]; 
    $params['openid.'.$item] = get_magic_quotes_gpc()?stripslashes($value):$value; 
} 
$params['openid.mode'] = 'check_authentication'; 
$params['openid.ns'] = $openid->data['openid_ns']; 
$params['openid.signed'] = $openid->data['openid_signed']; 
$params['openid.sig'] = $openid->data['openid_sig']; 

$tBody2 = $openid->request($tClaimedID,'POST',$params); 
echo "\n\n tBody2: ".$tBody2." \n\n"; 

    } 
} catch(ErrorException $e) { 
    echo $e->getMessage(); 
} 

回答

2

LightOpenID正在尋找/openid在尋找一個XRDS文檔的服務器上。

在任何響應以下添加到您的/openid文件:

<?php 
    header('X-XRDS-Location: https://www.google.com/accounts/o8/site-xrds?hd=example.com'); 
?> 

的原因,您嘗試在登錄後 ,谷歌將返回一個身份。這個身份必須被發現,到 看它是否指向有效的openid提供者(所以它不是 欺騙他們)。由於Gogole會在您的域中返回身份,因此您必須添加Google授權發佈的信息。 該信息必須爲/openid,因爲 的身份格式爲:http://example.com/openid?[...]。 否則,LightOpenID打開該URL,看不到任何指向任何 服務器的URL,並返回「找不到服務器!」。

+1

謝謝,MEWP!直接從源頭上。不幸的是,我正在使用Intranet。 .com並沒有直接訪問 .com是否可以regsub openid.identity到內聯網。 .com?id = 123並在Intranet上承載openid文件。 .com?它還沒有工作,我擔心Google OpenID簽名字段與 .com綁定。謝謝。 – 2011-04-12 23:01:42

+1

Google將以https:// {$ site_xrds}/openid?[...]'形式返回身份。不幸的是,如果此網址沒有XRDS文檔,則無法驗證Google是否有權返回該身份。所以要麼將你的site-xrds改成intranet。或者說服誰控制 .com將X-XRDS-Location標頭置於'/ openid'中。 – Mewp 2011-04-13 09:38:34

0

嗨,我面臨着同樣的問題,解決它:),你應該需要禁用安全模式:關閉,這是爲我工作:)