Я обнаружил, что проблема заключалась в том, что я пытался скрыть уже не спасенную строку.
field.Value<string>()
уже экранирует строку. Таким образом, решением моей проблемы было просто не вызывать Regex.Unescape
и использовать значение напрямую.
К сожалению.
Немного поздно в игре, но я смог заставить это работать с некоторыми хаками, которые я нашел в сети.
Во-первых. Yahoo. Все, что мне нужно было сделать, чтобы заставить Yahoo работать, - это изменить JavaScript, чтобы он использовал me.yahoo.com вместо просто yahoo.com , и он отлично работал с версией Zend Framework I. пользуюсь. К сожалению, Google по-прежнему этого не сделал, поэтому некоторые взломы были в порядке.
Все эти изменения внесены в Zend / OpenId / Consumer.php
Во-первых, в метод _discovery
добавьте метод после серии проверок preg_match, которая начинается примерно со строки 740.
} else if (preg_match('/<URI>([^<]+)<\/URI>/i', $response, $r)) {
$version = 2.0;
$server = $r[1];
Я добавил это прямо перед оператором return false;
, который находится в блоке else {}.
Во-вторых, в ] _checkId
вам нужно будет добавить 3 новых блока (я не Я изучил достаточно, чтобы понять, что вызывает каждый из этих трех случаев, поэтому я рассмотрел все, чтобы быть в безопасности.
Внутри блока $ version <= 2.0 вы найдете if / else if / еще блок. В первом операторе if ($ this -> _ session! == null)
добавьте это в конец:
if ($server == 'https://www.google.com/accounts/o8/ud') {
$this->_session->identity = 'http://specs.openid.net/auth/2.0/identifier_select';
$this->_session->claimed_id = 'http://specs.openid.net/auth/2.0/identifier_select';
}
В блоке else if (defined ('SID') добавьте это в конец:
if ($server == 'https://www.google.com/accounts/o8/ud') {
$_SESSION['zend_openid']['identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
$_SESSION['zend_openid']['claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
}
А затем после блока else (т.е. за пределами блока if / else if / else вместе, но все еще внутри блока $ version <= 2.0) добавьте следующее:
if ($server == 'https://www.google.com/accounts/o8/ud') {
$params['openid.identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
$params['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
}
Ссылка на ошибку в системе отслеживания проблем Zend Framework
Перебирая все предоставленные советы - я решил отказаться от использования класса zend_openid [извините за этот zend] и вместо этого я переключился на использование библиотеки JanRains OpenID. Потребовалось несколько часов, чтобы запустить его в работу с моим проектом, но, по крайней мере, он работал как ветер. Чтобы заставить его работать, пришлось много взломать и немного кода, но оно того стоит.
Я не мог использовать ни один из адаптеров Zend с Zend-Auth, чтобы приспособить эту новую библиотеку кода, как это делала библиотека. аутентификация сама по себе. Так что я взломал и сделал универсальный адаптер, который только что возвратил заполненный набор zend_result для объекта Auth, таким образом, я аутентифицируюсь, используя свою библиотеку, и просто сохраняю результат в объекте Auth, вытягивая немного быстрый объект Zend-Auth, вместо того, чтобы иметь переписать мой код снова.
Я имею дело с похожими проблемами. Я планирую сейчас использовать RPX с Zend Framework. Может быть, я напишу адаптер. Просто чтобы вы знали.
Информация: «RPS сейчас» предоставляет универсальный интерфейс и пользовательский интерфейс для регистрации пользователя на
Я почти уверен, что Yahoo работает только с OpenID 2.0 . Если вы хотите поддерживать пользователей Yahoo, вам придется перейти на библиотеку с поддержкой 2.0. Это будет чем-то большим, чем просто настройкой парсинга.
Вы ознакомились с руководством - Основы Zend_OpenId_Consumer ? Проверьте 38.2.2
на этой странице и дайте мне знать, если это поможет, потому что это должно.
В частности, я не знаю, предлагает ли Google OpenID. Я знаю, что Yahoo работал, потому что я пробовал это некоторое время назад.
Спасибо за информацию. Я начал с использования библиотеки JanRain, но у меня проблемы с тем, чтобы заставить работать Simple Registration: мне не удалось получить какие-либо данные таким образом. И нет документации по использованию Attribute Exchange. : (
Итак, я нашел и пробовал Zend / OpenId, но была та же проблема, что и у вас: нет Yahoo !, Google и кто знает, что еще поддерживают. Читая это, кажется, мне придется вернуться к JanRain; RPX в моем случае не вариант, так как это сторонний сервис.
Мне нужно использовать материал Google OpenID, я попробовал код Стивена и не смог заставить его работать как есть. Я внес некоторые изменения.
Метод изменения _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 Apps со следующими изменениями в дополнение к приведенным выше:
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 */
Я считаю, что это было единственное изменение, которое мне пришлось сделать. Я почти уверен, что здесь должна быть некоторая проверка, связанная с вышеизложенным, из соображений безопасности, но я еще не изучил это достаточно глубоко, чтобы увидеть, какими они будут.