То, как я реализую Прямые Идентификационные данные, основывало аутентификацию OpenID с Пехлеви OpenID

Я обнаружил, что проблема заключалась в том, что я пытался скрыть уже не спасенную строку.

field.Value<string>() уже экранирует строку. Таким образом, решением моей проблемы было просто не вызывать Regex.Unescape и использовать значение напрямую.

К сожалению.

16
задан Ali 15 April 2009 в 07:48
поделиться

7 ответов

Немного поздно в игре, но я смог заставить это работать с некоторыми хаками, которые я нашел в сети.

Во-первых. 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

9
ответ дан 30 November 2019 в 22:43
поделиться

Перебирая все предоставленные советы - я решил отказаться от использования класса zend_openid [извините за этот zend] и вместо этого я переключился на использование библиотеки JanRains OpenID. Потребовалось несколько часов, чтобы запустить его в работу с моим проектом, но, по крайней мере, он работал как ветер. Чтобы заставить его работать, пришлось много взломать и немного кода, но оно того стоит.

Я не мог использовать ни один из адаптеров Zend с Zend-Auth, чтобы приспособить эту новую библиотеку кода, как это делала библиотека. аутентификация сама по себе. Так что я взломал и сделал универсальный адаптер, который только что возвратил заполненный набор zend_result для объекта Auth, таким образом, я аутентифицируюсь, используя свою библиотеку, и просто сохраняю результат в объекте Auth, вытягивая немного быстрый объект Zend-Auth, вместо того, чтобы иметь переписать мой код снова.

2
ответ дан 30 November 2019 в 22:43
поделиться

Я имею дело с похожими проблемами. Я планирую сейчас использовать RPX с Zend Framework. Может быть, я напишу адаптер. Просто чтобы вы знали.

Информация: «RPS сейчас» предоставляет универсальный интерфейс и пользовательский интерфейс для регистрации пользователя на

  • facebook
  • Google
  • Yahoo
  • mySpaceID
  • Windows LiveID
  • OpenID
  • aol
1
ответ дан 30 November 2019 в 22:43
поделиться

Я почти уверен, что Yahoo работает только с OpenID 2.0 . Если вы хотите поддерживать пользователей Yahoo, вам придется перейти на библиотеку с поддержкой 2.0. Это будет чем-то большим, чем просто настройкой парсинга.

1
ответ дан 30 November 2019 в 22:43
поделиться

Вы ознакомились с руководством - Основы Zend_OpenId_Consumer ? Проверьте 38.2.2 на этой странице и дайте мне знать, если это поможет, потому что это должно.

В частности, я не знаю, предлагает ли Google OpenID. Я знаю, что Yahoo работал, потому что я пробовал это некоторое время назад.

0
ответ дан 30 November 2019 в 22:43
поделиться

Спасибо за информацию. Я начал с использования библиотеки JanRain, но у меня проблемы с тем, чтобы заставить работать Simple Registration: мне не удалось получить какие-либо данные таким образом. И нет документации по использованию Attribute Exchange. : (

Итак, я нашел и пробовал Zend / OpenId, но была та же проблема, что и у вас: нет Yahoo !, Google и кто знает, что еще поддерживают. Читая это, кажется, мне придется вернуться к JanRain; RPX в моем случае не вариант, так как это сторонний сервис.

0
ответ дан 30 November 2019 в 22:43
поделиться

Мне нужно использовать материал 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 */

Я считаю, что это было единственное изменение, которое мне пришлось сделать. Я почти уверен, что здесь должна быть некоторая проверка, связанная с вышеизложенным, из соображений безопасности, но я еще не изучил это достаточно глубоко, чтобы увидеть, какими они будут.

3
ответ дан 30 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: