Мне нужно использовать OpenID от Google, и я попробовал код Стивена и не смог заставить его работать как есть. Я сделал несколько модификаций.
Метод изменения _discovery остается прежним:
Zend / OpenId / Consumer.php, строка 765, добавить:
} else if (preg_match('/<URI>([^<]+)<\/URI>/i', $response, $r)) {
$version = 2.0;
$server = $r[1];
Остальное отличается, однако:
Zend / OpenId / Consumer.php, строка 859 (после внесения вышеуказанных изменений), добавьте:
if (stristr($server, 'https://www.google.com/') !== false) {
$id = 'http://specs.openid.net/auth/2.0/identifier_select';
$claimedId = 'http://specs.openid.net/auth/2.0/identifier_select';
}
Это прямо перед:
$params['openid.identity'] = $id;
$params['openid.claimed_id'] = $claimedId;
И чтобы получить его, чтобы вернуть идентификатор, после авторизации:
Zend / Auth / Adapter / OpenId.php, строка 278:
if(isset($_REQUEST['openid_identity']))
{
$this->_id = $_REQUEST['openid_identity'];
$id = $this->_id;
}
Это прямо перед:
return new Zend_Auth_Result(
Zend_Auth_Result::SUCCESS,
$id,
array("Authentication successful"));
Обратите внимание, что я не проверил тщательно этот код. Код ниже еще более шаткий.
Я потратил больше времени и заставил его работать с моим доменом Служб Google со следующими изменениями, помимо перечисленных выше:
Zend / OpenId / Consumer.php, строка 734
$discovery_url = $id;
if(strpos($discovery_url, '/', strpos($discovery_url, '//')+2) !== false) {
$discovery_url = substr($discovery_url, 0, strpos($discovery_url, '/', strpos($discovery_url, '//')+2));
}
$discovery_url .= '/.well-known/host-meta';
$response = $this->_httpRequest($discovery_url, 'GET', array(), $status);
if ($status === 200 && is_string($response)) {
if (preg_match('/Link: <([^><]+)>/i', $response, $r)) {
$id = $r[1];
}
}
Это сразу после:
/* TODO: OpenID 2.0 (7.3) XRI and Yadis discovery */
Я считаю, что это было единственное изменение, которое я должен был сделать. Я почти уверен, что по соображениям безопасности должна быть проведена некоторая проверка с вышеперечисленным, но я не слишком углубился в это, чтобы увидеть, какими они будут.