2012-04-08 5 views
0

Ich habe versucht, OpenID-Authentifizierung als Verbraucher in einem Projekt, das ich entwickeln, zu implementieren, und ich habe es noch nicht geschafft, auch die Beispiele arbeiten, wie ich will .501 HTTP-Fehler beim Versuch, PHP OpenID mit Google zu verwenden

Obwohl der Beispiel-Consumer perfekt für die Yahoo-Openid-Authentifizierung funktioniert, schlägt er in der try_auth.php-Seite mit einem HTTP-Fehler 501 fehl, wenn er versucht, google openID zu verwenden.

Hier ist der Code für try_auth.php (die Seite, die den Anruf an den tatsächlichen OpenID-Provider Griffe):

<?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(); 

?> 

Ein weiteres denke ich bemerkt, dass auf meinem Windows Dev-Box (Apache 2.2.6 Standalone, Nicht XAMPP, PHP 5.3.8) läuft alles reibungslos, sowohl Yahoo als auch Google führen OpenID-Authentifizierung ohne Probleme durch.

Wer hat eine Idee, was könnte falsch sein?

Vielen Dank im Voraus.

+0

Können Sie uns einen Code zeigen – Baba

+0

ist es der Beispiel-Verbraucher-Code, der mit Janrain Openid geliefert wird. Ich habe keine einzige Codezeile von dort geändert. Ich werde die Datei veröffentlichen, sobald ich Zugriff auf meine Haupt-Dev-Maschine habe ... – Yiangos

+0

füge 'error_reporting (E_ALL);' und 'ini_set ('display_errors', 'On');' zu deinem Code hinzu und extrahiere die exakter PHP-Fehler – Baba

Antwort

0

Nach einigem Versuch und Irrtum kam ich zu der Schlussfolgerung, dass der Fehler 501 aufgrund der URL von Google openID auftritt, die an die Seite entweder als Querystring (für Formularmethode "get") oder postdata (für Formularmethode) übergeben wird. Post"). Insbesondere ich die URL wurde mit ist

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

der letzte Teil (die "id"), um die 501 Fehler auslöst. Wenn ich

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

der Fehler verwenden wird nicht ausgelöst. Nun, da die beiden gleichwertige URLs sind, werde ich die zweite verwenden. Ich bin immer noch neugierig, warum das passiert ist.

Verwandte Themen