2012-05-28 4 views
2

OpenID가 잘못 구현되었거나 문서화되어 있기 때문에이 말을 싫어합니다.Janrain의 OpenID로 Google 사용자 정보를 검색 할 수 없다 PHP 라이브러리 로그인

"openid-php-openid-2.2.2-24"를 사용하려고합니다. 여기에 소스 코드 : https://github.com/openid/php-openid

인증 예를 사용하면 나에게 돌아갑니다. "https://www.google.com/accounts/o8/id?id= [. ..]을 귀하의 신원으로 사용하십시오

공급자가 PAPE 응답을 보내지 않았습니다. "

하지만 Google의 openid 로그인 데이터의 이메일, 닉네임 또는 전체 이름의 그림자는 없습니다. 파일 ("/openid/examples/consumer/finish_auth.php")을 읽는 동안 SREG 변수를 "You have successfully verified"및 "PAPE 응답 없음"메시지 사이에 인쇄해야하지만, :

$success = sprintf('You have successfully verified ' . 
         '<a href="%s">%s</a> as your identity.', 
         $esc_identity, $esc_identity); 

    if ($response->endpoint->canonicalID) { 
     $escaped_canonicalID = escape($response->endpoint->canonicalID); 
     $success .= ' (XRI CanonicalID: '.$escaped_canonicalID.') '; 
    } 

    $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response); 

    $sreg = $sreg_resp->contents(); 

    if (@$sreg['email']) { 
     $success .= " You also returned '".escape($sreg['email']). 
      "' as your email."; 
    } 

    if (@$sreg['nickname']) { 
     $success .= " Your nickname is '".escape($sreg['nickname']). 
      "'."; 
     $_SESSION['nickname'] = escape($sreg['nickname']); 
    } 

    if (@$sreg['fullname']) { 
     $success .= " Your fullname is '".escape($sreg['fullname']). 
      "'."; 
    } 

$pape_resp = Auth_OpenID_PAPE_Response::fromSuccessResponse($response); 

if ($pape_resp) { 
    [...] 
} else { 
     $success .= "<p>No PAPE response was sent by the provider.</p>"; 
} 

나는 $ sreg [ '이메일'], $의 sreg [ '별명']과의 내용을 인쇄하려고했습니다 $ sreg [ '전체 이름'],하지만 그들은 모두 빈 내용을 반환 (널 (null)/빈 값). 나는 사용자들이 로그인 할 때 사용하는 계정의 이메일 주소를 검색해야

..

단테

+1

솔루션을 제공해 주셔서 감사합니다. 답을 상자로 옮기시겠습니까? 그러면 미래의 독자는 원래의 질문과 답을 구별 할 수 있습니다. (이것은 일반적으로 자신의 질문에 대답 할 때 좋은 습관입니다.) 감사! – halfer

답변

0

대답없는 목록 해제 문제를 얻으려면, 내가 대답 여기에 단테의 답변을 게시 :


내 문제가 해결되었습니다. PHP에서 AX를 사용한 예제 OpenID : Example usage of AX in PHP OpenID 연구 2 일 후에 방금 "(Google은 SReg 대신 AX (attribute exchange)를 사용하여 추가 데이터를 얻습니다") 대답을 찾았습니다. 왜 Google이 항상 다른 이유가 있어야합니까?

그러나 그 stackoverflow 대답 페이지의 코드는 나를 위해 작동하지 않습니다 (내 호스팅 서버는 500 내부 서버 오류 코드를 반환합니다). 그래서, 나는 "내 코드"(너무 거친) 여기에 게시 :

oid_ax_common.php

<?php 

// Circumnavigate bugs in the GMP math library that can be result in signature 
// validation errors 
define('Auth_OpenID_BUGGY_GMP', true); 

$path_extra = dirname(dirname(dirname(__FILE__))); 
$path = ini_get('include_path'); 
$path = $path_extra . PATH_SEPARATOR . $path; 
ini_set('include_path', $path); 


function displayError($message) { 
    $error = $message; 
    include './index.php'; 
    exit(0); 
} 

function doIncludes() { 
    /** 
    * Require the OpenID consumer code. 
    */ 
    require_once "Auth/OpenID/Consumer.php"; 

    /** 
    * Require the "file store" module, which we'll need to store 
    * OpenID information. 
    */ 
    require_once "Auth/OpenID/FileStore.php"; 

    /** 
    * Require the Simple Registration extension API. 
    */ 
    //require_once "Auth/OpenID/SReg.php"; 
    require_once "Auth/OpenID/AX.php"; 

    /** 
    * Require the PAPE extension module. 
    */ 
    require_once "Auth/OpenID/PAPE.php"; 
} 

doIncludes(); 

global $pape_policy_uris; 
$pape_policy_uris = array(
       PAPE_AUTH_MULTI_FACTOR_PHYSICAL, 
       PAPE_AUTH_MULTI_FACTOR, 
       PAPE_AUTH_PHISHING_RESISTANT 
      ); 

function &getStore() { 
    /** 
    * This is where the example will store its OpenID information. 
    * You should change this path if you want the example store to be 
    * created elsewhere. After you're done playing with the example 
    * script, you'll have to remove this directory manually. 
    */ 
    $store_path = null; 
    if (function_exists('sys_get_temp_dir')) { 
     $store_path = sys_get_temp_dir(); 
    } 
    else { 
     if (strpos(PHP_OS, 'WIN') === 0) { 
      $store_path = $_ENV['TMP']; 
      if (!isset($store_path)) { 
       $dir = 'C:\Windows\Temp'; 
      } 
     } 
     else { 
      $store_path = @$_ENV['TMPDIR']; 
      if (!isset($store_path)) { 
       $store_path = '/tmp'; 
      } 
     } 
    } 
    $store_path = './tmp/'; 
    $store_path .= DIRECTORY_SEPARATOR . '_php_consumer_test'; 

    if (!file_exists($store_path) && 
     !mkdir($store_path)) { 
     print "Could not create the FileStore directory '$store_path'. ". 
      " Please check the effective permissions."; 
     exit(0); 
    } 
    $r = new Auth_OpenID_FileStore($store_path); 

    return $r; 
} 

function &getConsumer() { 
    /** 
    * Create a consumer object using the store object created 
    * earlier. 
    */ 
    $store = getStore(); 
    $r = new Auth_OpenID_Consumer($store); 
    return $r; 
} 

function getScheme() { 
    $scheme = 'http'; 
    if (isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] == 'on') { 
     $scheme .= 's'; 
    } 
    return $scheme; 
} 

function getReturnTo() { 
    return sprintf("%s://%s:%s%s/oid_ax_receive.php", 
        getScheme(), $_SERVER['SERVER_NAME'], 
        $_SERVER['SERVER_PORT'], 
        dirname($_SERVER['PHP_SELF'])); 
} 

function getTrustRoot() { 
    return sprintf("%s://%s:%s%s/", 
        getScheme(), $_SERVER['SERVER_NAME'], 
        $_SERVER['SERVER_PORT'], 
        dirname($_SERVER['PHP_SELF'])); 
} 

?> 

oid_ax_send.php

<?php 

require_once "oid_ax_common.php"; 
// Starts session (needed for YADIS) 
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() { 
    // https://www.google.com/accounts/o8/id 
    // $openid = 'http://openid-provider.appspot.com/'; 
    $openid = 'https://www.google.com/accounts/o8/id'; 
    // $openid .= getOpenIDURL(); 
    $consumer = getConsumer(); 

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

    // Create attribute request object 
    // See http://code.google.com/apis/accounts/docs/OpenID.html#Parameters for parameters 
    // Usage: make($type_uri, $count=1, $required=false, $alias=null) 
    $attribute[] = Auth_OpenID_AX_AttrInfo::make('http://axschema.org/contact/email',2,1, 'email'); 
    $attribute[] = Auth_OpenID_AX_AttrInfo::make('http://axschema.org/namePerson/first',1,1, 'firstname'); 
    $attribute[] = Auth_OpenID_AX_AttrInfo::make('http://axschema.org/namePerson/last',1,1, 'lastname'); 

    // Create AX fetch request 
    $ax = new Auth_OpenID_AX_FetchRequest; 

    // Add attributes to AX fetch request 
    foreach($attribute as $attr){ 
     $ax->add($attr); 
    } 

    // Add AX fetch request to authentication request 
    $auth_request->addExtension($ax); 

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

?> 

oid_ax_receive.php

<?php 

require_once "oid_ax_common.php"; 
// Starts session (needed for YADIS) 
session_start(); 

function escape($thing) { 
    return htmlentities($thing); 
} 

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

    // Complete the authentication process using the server's 
    // response. 
    $return_to = getReturnTo(); 
    $response = $consumer->complete($return_to); 

    // Check the response status. 
    if ($response->status == Auth_OpenID_CANCEL) { 
     // This means the authentication was cancelled. 
     $msg = 'Verification cancelled.'; 
    } else if ($response->status == Auth_OpenID_FAILURE) { 
     // Authentication failed; display the error message. 
     $msg = "OpenID authentication failed: " . $response->message; 
    } else if ($response->status == Auth_OpenID_SUCCESS) { 
     // Get registration informations 
     $ax = new Auth_OpenID_AX_FetchResponse(); 
     $obj = $ax->fromSuccessResponse($response); 

     // Print me raw 
     echo '<pre>'; 
     print_r($obj->data); 
     echo '</pre>'; 
     exit; 

     $pape_resp = Auth_OpenID_PAPE_Response::fromSuccessResponse($response); 

     if ($pape_resp) { 
      if ($pape_resp->auth_policies) { 
       $success .= "<p>The following PAPE policies affected the authentication:</p><ul>"; 

       foreach ($pape_resp->auth_policies as $uri) { 
        $escaped_uri = escape($uri); 
        $success .= "<li><tt>$escaped_uri</tt></li>"; 
       } 

       $success .= "</ul>"; 
      } else { 
       $success .= "<p>No PAPE policies affected the authentication.</p>"; 
      } 

      if ($pape_resp->auth_age) { 
       $age = escape($pape_resp->auth_age); 
       $success .= "<p>The authentication age returned by the " . 
        "server is: <tt>".$age."</tt></p>"; 
      } 

      if ($pape_resp->nist_auth_level) { 
       $auth_level = escape($pape_resp->nist_auth_level); 
       $success .= "<p>The NIST auth level returned by the " . 
        "server is: <tt>".$auth_level."</tt></p>"; 
      } 

     } else { 
       $success .= "<p>No PAPE response was sent by the provider.</p>"; 
     } 

    } 

    include './index.php'; 
} 

run(); 

?> 

즐겨. 나는 구글과 사용자 정보/로그인 데이터 내 문제를 해결하지만

단테

P.S는 : 난 아직도 빛 오픈 ID로 하나의 문제가있다, (https://stackoverflow.com/questions/10735708/lightopenid-openid-authurl-does-not-return-any-value)를 오픈 ID의 오페라를 완료합니다. 나를 돕고 싶다면, 우리는 OpenID 이야기를 완전히 풀어서 결론을 내릴 것입니다.