Ошибка HTTP 501 при попытке использовать php OpenID с Google

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

Несмотря на то, что пример-потребитель отлично работает для аутентификации yahoo openid, он не работает на странице try_auth.php с ошибкой 501 HTTP при попытке использовать google openID.

Вот код для try_auth.php (страница, которая обрабатывает вызов фактического провайдера openID):

<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
require_once "common.php";
session_start();

function getOpenIDURL() {
    // Render a default page if we got a submission without an openid
    // value.
    if (empty($_GET['openid_identifier'])) {
        $error = "Expected an OpenID URL.";
        include 'index.php';
        exit(0);
    }

    return $_GET['openid_identifier'];
}

function run() {
    $openid = getOpenIDURL();
    $consumer = getConsumer();

    // Begin the OpenID authentication process.
    $auth_request = $consumer->begin($openid);

    // No auth request means we can't begin OpenID.
    if (!$auth_request) {
        displayError("Authentication error; not a valid OpenID.");
    }

    $sreg_request = Auth_OpenID_SRegRequest::build(
                                     // Required
                                     array('nickname'),
                                     // Optional
                                     array('fullname', 'email'));

    if ($sreg_request) {
        $auth_request->addExtension($sreg_request);
    }

    $policy_uris = null;
    if (isset($_GET['policies'])) {
        $policy_uris = $_GET['policies'];
    }

    $pape_request = new Auth_OpenID_PAPE_Request($policy_uris);
    if ($pape_request) {
        $auth_request->addExtension($pape_request);
    }

    // Redirect the user to the OpenID server for authentication.
    // Store the token for this authentication so we can verify the
    // response.

    // For OpenID 1, send a redirect.  For OpenID 2, use a Javascript
    // form to send a POST request to the server.
    if ($auth_request->shouldSendRedirect()) {
        $redirect_url = $auth_request->redirectURL(getTrustRoot(),
                                                   getReturnTo());

        // If the redirect URL can't be built, display an error
        // message.
        if (Auth_OpenID::isFailure($redirect_url)) {
            displayError("Could not redirect to server: " . $redirect_url->message);
        } else {
            // Send redirect.
            header("Location: ".$redirect_url);
        }
    } else {
        // Generate form markup and render it.
        $form_id = 'openid_message';
        $form_html = $auth_request->htmlMarkup(getTrustRoot(), getReturnTo(),
                                               false, array('id' => $form_id));

        // Display an error if the form markup couldn't be generated;
        // otherwise, render the HTML.
        if (Auth_OpenID::isFailure($form_html)) {
            displayError("Could not redirect to server: " . $form_html->message);
        } else {
            print $form_html;
        }
    }
}

run();

?>

Еще я заметил, что в моем окне разработчика для Windows (автономный Apache 2.2.6, а не XAMPP, PHP 5.3.8) все работает гладко, и Yahoo, и Google выполняют аутентификацию openID без каких-либо проблем.

У кого-нибудь есть идеи, что может быть не так?

Заранее спасибо.


person Yiangos    schedule 08.04.2012    source источник
comment
это пример потребительского кода, который поставляется с janrain openid. Я не изменил ни строчки кода оттуда. Я отправлю файл, как только у меня появится доступ к моей основной машине разработчика ...   -  person Yiangos    schedule 08.04.2012
comment
добавьте error_reporting(E_ALL); и ini_set('display_errors','On'); в свой код и извлеките точную ошибку PHP   -  person Baba    schedule 08.04.2012
comment
Сомневаюсь, что это ошибка PHP. Ошибки PHP приводят к ошибке HTTP 500 от сервера Apache. Однако я получаю ошибку HTTP 501, т.е. метод не реализован. Что действительно странно, так это то, что та же самая настройка работает нормально, если я использую Yahoo OpenID.   -  person Yiangos    schedule 08.04.2012
comment
Отредактировал исходный пост, чтобы включить исходный код (включая директивы сообщения об ошибках и отображения ошибок). Я все еще получаю ошибку 501 при попытке открыть идентификатор Google. Я думаю, это как-то связано с сервером, но не знаю что.   -  person Yiangos    schedule 09.04.2012


Ответы (1)


После некоторых проб и ошибок я пришел к выводу, что ошибка 501 возникает из-за того, что URL-адрес openID Google передается на страницу либо в виде строки запроса (для метода формы "get"), либо в виде постданных (для метода формы "post"). В частности, я использовал URL-адрес

https://www.google.com/accounts/o8/id

последняя часть («идентификатор») вызывает ошибку 501. Если я использую

https://www.google.com/accounts/o8/id/

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

person Yiangos    schedule 08.04.2012