Последний шаг проверки OpenID, всегда возвращает «is_valid: false» - PullRequest
3 голосов
/ 05 апреля 2011

Проблема Я пытаюсь заставить LightOpenID работать с учетной записью Google Apps Enterprise. Я получаю "Серверы не найдены!" когда я позвонил validate (). Я макетировал быструю страницу, чтобы протестировать каждый шаг LightOpenID, и я продвинулся немного дальше, теперь всегда получаю «is_valid: false».

Что я уже сделал Работая с помощью validate () и Discover () построчно, я заметил, что некоторые значения openid-> data [] (думаю, "openid_ *") не попадают в окончательный массив params (например, "openid. *"), Поэтому в моем примере ниже я закодировал их явно. Я не могу сказать, всегда ли я получаю is_valid: false, потому что мне не хватает значения openid. что-то или потому, что OpenID говорит, что провайдер должен проверять каждый nonce только один раз или что-то еще.

Как вы можете мне помочь Если вы продвинулись так далеко, я мог бы использовать одну из двух вещей. Либо укажите ошибки в моем примере кода, либо укажите процесс, который вы использовали для тестирования такого рода вещей. Нужно ли мне выходить из системы / возвращаться каждый раз, когда я хочу проверить шаг проверки / подтверждения? Существуют ли какие-либо инструменты или процессы, которые ускоряют эту работу?

ПРИМЕРНЫЙ КОД Я заменил свой домен на example.com. Дайте мне знать, если вы хотите какой-либо вывод. Спасибо, Эрик Б.

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 ]

2 голосов
/ 07 апреля 2011

LightOpenID ищет /openid на вашем сервере в поисках документа XRDS.

Добавьте следующее во все ответы на ваш /openid документ:

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

Причина в том, что после попытки войти в Google возвращает личность. Эта личность должна быть обнаружена, чтобы посмотрите, указывает ли он на действующего провайдера openid (чтобы он не подделка их). Так как Гоголь возвращает личность в вашем домене, вы Нужно добавить информацию, которую Google уполномочен выдавать им. Информация должна быть на /openid, так как тождества в форме: http://example.com/openid?[...]. В противном случае LightOpenID открывает этот URL-адрес, не видит ничего, указывающего на какой-либо сервер и возвращает сообщение «Серверы не найдены!».

0 голосов
/ 11 мая 2013

Привет, я столкнулся с той же проблемой и решил ее :), вам нужно отключить безопасный режим: выкл, это работает для меня:)

...