2011-07-17 16 views
1

class.openid.phpは、
lightopenid
よりも単純で小さいため、勉強しようとしています。私の目的のために、200行が重要です。class.openid.phpはgoogle openIDで作業していますか?

ERROR CODE: OPENID_NOSERVERSFOUND 
ERROR DESCRIPTION: Cannot find OpenID Server TAG on Identity page. 

それはclass.openid.php(すべてのバージョン)を作成することが可能である、そのようなことを行うためにGoogleのOpenIDとどのように動作します。しかし、class.openid.phpは私には、GoogleのOpenIDのhttps://www.google.com/accounts/o8/idで、このようなエラーをプリントを動作しませんか?

HTML:私は、誰かが私が持っているコードを見たい場合には、すべての<?を見つけ、<?phpでTHAMを交換しなければならなかった

class.openid.phphereを撮影することができますが、それは箱から出して私のために働いていませんでしたインタフェースページ:

<?php 
require('class.openid.v3.php'); 

if ($_POST['openid_action'] == "login"){ // Get identity from user and redirect browser to OpenID Server 
    $openid = new SimpleOpenID; 
    $openid->SetIdentity($_POST['openid_url']); 
    $openid->SetTrustRoot('http://' . $_SERVER["HTTP_HOST"]); 
    $openid->SetRequiredFields(array('email','fullname')); 
    $openid->SetOptionalFields(array('dob','gender','postcode','country','language','timezone')); 
    if ($openid->GetOpenIDServer()){ 
     $openid->SetApprovedURL('http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PATH_INFO"]);  // Send Response from OpenID server to this script 
     $openid->Redirect(); // This will redirect user to OpenID Server 
    }else{ 
     $error = $openid->GetError(); 
     echo "ERROR CODE: " . $error['code'] . "<br>"; 
     echo "ERROR DESCRIPTION: " . $error['description'] . "<br>"; 
    } 
    exit; 
} 
else if($_GET['openid_mode'] == 'id_res'){ // Perform HTTP Request to OpenID server to validate key 
    $openid = new SimpleOpenID; 
    $openid->SetIdentity($_GET['openid_identity']); 
    $openid_validation_result = $openid->ValidateWithServer(); 
    if ($openid_validation_result == true){   // OK HERE KEY IS VALID 
     echo "VALID"; 
    }else if($openid->IsError() == true){   // ON THE WAY, WE GOT SOME ERROR 
     $error = $openid->GetError(); 
     echo "ERROR CODE: " . $error['code'] . "<br>"; 
     echo "ERROR DESCRIPTION: " . $error['description'] . "<br>"; 
    }else{           // Signature Verification Failed 
     echo "INVALID AUTHORIZATION"; 
    } 
}else if ($_GET['openid_mode'] == 'cancel'){ // User Canceled your Request 
    echo "USER CANCELED REQUEST"; 
} 
?> 
<html> 
<head> 
    <title>OpenID Example</title> 
</head> 
<body> 
<div> 
<fieldset id="openid"> 
<legend>OpenID Login</legend> 
<form action="<?php echo 'http://' . $_SERVER["HTTP_HOST"] . $_SERVER["PATH_INFO"]; ?>" method="post" onsubmit="this.login.disabled=true;"> 
<input type="hidden" name="openid_action" value="login"> 
<div><input type="text" name="openid_url" class="openid_login"><input type="submit" name="login" value="login &gt;&gt;"></div> 
<div><a href="http://www.myopenid.com/" class="link" >Get an OpenID</a></div> 
</form> 
</fieldset> 
</div> 
<div style="margin-top: 2em; font-family: arial; font-size: 0.8em; border-top:1px solid gray; padding: 4px;">Sponsored by: <a href="http://www.fivestores.com">FiveStores</a> - get your free online store; includes extensive API for developers; <i style="color: gray;">integrated with <a href="http://en.wikipedia.org/wiki/OpenID">OpenID</a></i></div> 
</body> 
</html> 

とPHPのクラス

<?php 
/* 
    FREE TO USE Under License: GPLv3 
    Simple OpenID PHP Class 
    Some modifications by Eddie Roosenmaallen, [email protected] 
*/ 

class SimpleOpenID{ 
    var $openid_url_identity; 
    var $URLs = array(); 
    var $error = array(); 
    var $fields = array(
     'required' => array(), 
     'optional' => array(), 
    ); 

    function SimpleOpenID(){ 
     if (!function_exists('curl_exec')) { 
      die('Error: Class SimpleOpenID requires curl extension to work'); 
     } 
    } 

    function SetOpenIDServer($a){ 
     $this->URLs['openid_server'] = $a; 
    } 

    function SetTrustRoot($a){ 
     $this->URLs['trust_root'] = $a; 
    } 

    function SetCancelURL($a){ 
     $this->URLs['cancel'] = $a; 
    } 

    function SetApprovedURL($a){ 
     $this->URLs['approved'] = $a; 
    } 

    function SetRequiredFields($a){ 
     if (is_array($a)){ 
      $this->fields['required'] = $a; 
     }else{ 
      $this->fields['required'][] = $a; 
     } 
    } 

    function SetOptionalFields($a){ 
     if (is_array($a)){ 
      $this->fields['optional'] = $a; 
     }else{ 
      $this->fields['optional'][] = $a; 
     } 
    } 

    function SetIdentity($a){ // Set Identity URL 
      if ((stripos($a, 'http://') === false) 
       && (stripos($a, 'https://') === false)){ 
       $a = 'http://'.$a; 
      } 
      $this->openid_url_identity = $a; 
    } 

    function GetIdentity(){  // Get Identity 
     return $this->openid_url_identity; 
    } 

    function GetError(){ 
     $e = $this->error; 
     return array('code'=>$e[0],'description'=>$e[1]); 
    } 

    function ErrorStore($code, $desc = null){ 
     $errs['OPENID_NOSERVERSFOUND'] = 'Cannot find OpenID Server TAG on Identity page.'; 
     if ($desc == null){ 
      $desc = $errs[$code]; 
     } 
     $this->error = array($code,$desc); 
    } 

    function IsError(){ 
     if (count($this->error) > 0){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 

    function splitResponse($response) { 
     $r = array(); 
     $response = explode("\n", $response); 
     foreach($response as $line) { 
      $line = trim($line); 
      if ($line != "") { 
       list($key, $value) = explode(":", $line, 2); 
       $r[trim($key)] = trim($value); 
      } 
     } 
     return $r; 
    } 

    function OpenID_Standarize($openid_identity = null){ 
     if ($openid_identity === null) 
      $openid_identity = $this->openid_url_identity; 

     $u = parse_url(strtolower(trim($openid_identity))); 

     if (!isset($u['path']) || ($u['path'] == '/')) { 
      $u['path'] = ''; 
     } 
     if(substr($u['path'],-1,1) == '/'){ 
      $u['path'] = substr($u['path'], 0, strlen($u['path'])-1); 
     } 
     if (isset($u['query'])){ // If there is a query string, then use identity as is 
      return $u['host'] . $u['path'] . '?' . $u['query']; 
     }else{ 
      return $u['host'] . $u['path']; 
     } 
    } 

    function array2url($arr){ // converts associated array to URL Query String 
     if (!is_array($arr)){ 
      return false; 
     } 
     $query = ''; 
     foreach($arr as $key => $value){ 
      $query .= $key . "=" . $value . "&"; 
     } 
     return $query; 
    } 

    function CURL_Request($url, $method="GET", $params = "") { // Remember, SSL MUST BE SUPPORTED 
      if (is_array($params)) $params = $this->array2url($params); 
      $curl = curl_init($url . ($method == "GET" && $params != "" ? "?" . $params : "")); 
      curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
      curl_setopt($curl, CURLOPT_HEADER, false); 
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
      curl_setopt($curl, CURLOPT_HTTPGET, ($method == "GET")); 
      curl_setopt($curl, CURLOPT_POST, ($method == "POST")); 
      if ($method == "POST") curl_setopt($curl, CURLOPT_POSTFIELDS, $params); 
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
      $response = curl_exec($curl); 

      if (curl_errno($curl) == 0){ 
       $response; 
      }else{ 
       $this->ErrorStore('OPENID_CURL', curl_error($curl)); 
      } 
      return $response; 
    } 

    function HTML2OpenIDServer($content) { 
     $get = array(); 

     // Get details of their OpenID server and (optional) delegate 
     preg_match_all('/<link[^>]*rel=[\'"]openid.server[\'"][^>]*href=[\'"]([^\'"]+)[\'"][^>]*\/?>/i', $content, $matches1); 
     preg_match_all('/<link[^>]*href=\'"([^\'"]+)[\'"][^>]*rel=[\'"]openid.server[\'"][^>]*\/?>/i', $content, $matches2); 
     $servers = array_merge($matches1[1], $matches2[1]); 

     preg_match_all('/<link[^>]*rel=[\'"]openid.delegate[\'"][^>]*href=[\'"]([^\'"]+)[\'"][^>]*\/?>/i', $content, $matches1); 

     preg_match_all('/<link[^>]*href=[\'"]([^\'"]+)[\'"][^>]*rel=[\'"]openid.delegate[\'"][^>]*\/?>/i', $content, $matches2); 

     $delegates = array_merge($matches1[1], $matches2[1]); 

     $ret = array($servers, $delegates); 
     return $ret; 
    } 

    function GetOpenIDServer(){ 
     $response = $this->CURL_Request($this->openid_url_identity); 
     list($servers, $delegates) = $this->HTML2OpenIDServer($response); 
     if (count($servers) == 0){ 
      $this->ErrorStore('OPENID_NOSERVERSFOUND'); 
      return false; 
     } 
     if (isset($delegates[0]) 
      && ($delegates[0] != "")){ 
      $this->SetIdentity($delegates[0]); 
     } 
     $this->SetOpenIDServer($servers[0]); 
     return $servers[0]; 
    } 

    function GetRedirectURL(){ 
     $params = array(); 
     $params['openid.return_to'] = urlencode($this->URLs['approved']); 
     $params['openid.mode'] = 'checkid_setup'; 
     $params['openid.identity'] = urlencode($this->openid_url_identity); 
     $params['openid.trust_root'] = urlencode($this->URLs['trust_root']); 

     if (isset($this->fields['required']) 
      && (count($this->fields['required']) > 0)) { 
      $params['openid.sreg.required'] = implode(',',$this->fields['required']); 
     } 
     if (isset($this->fields['optional']) 
      && (count($this->fields['optional']) > 0)) { 
      $params['openid.sreg.optional'] = implode(',',$this->fields['optional']); 
     } 
     return $this->URLs['openid_server'] . "?". $this->array2url($params); 
    } 

    function Redirect(){ 
     $redirect_to = $this->GetRedirectURL(); 
     if (headers_sent()){ // Use JavaScript to redirect if content has been previously sent (not recommended, but safe) 
      echo '<script language="JavaScript" type="text/javascript">window.location=\''; 
      echo $redirect_to; 
      echo '\';</script>'; 
     }else{ // Default Header Redirect 
      header('Location: ' . $redirect_to); 
     } 
    } 

    function ValidateWithServer(){ 
     $params = array(
      'openid.assoc_handle' => urlencode($_GET['openid_assoc_handle']), 
      'openid.signed' => urlencode($_GET['openid_signed']), 
      'openid.sig' => urlencode($_GET['openid_sig']) 
     ); 
     // Send only required parameters to confirm validity 
     $arr_signed = explode(",",str_replace('sreg.','sreg_',$_GET['openid_signed'])); 
     for ($i=0; $i<count($arr_signed); $i++){ 
      $s = str_replace('sreg_','sreg.', $arr_signed[$i]); 
      $c = $_GET['openid_' . $arr_signed[$i]]; 
      // if ($c != ""){ 
       $params['openid.' . $s] = urlencode($c); 
      // } 
     } 
     $params['openid.mode'] = "check_authentication"; 

     $openid_server = $this->GetOpenIDServer(); 
     if ($openid_server == false){ 
      return false; 
     } 
     $response = $this->CURL_Request($openid_server,'POST',$params); 
     $data = $this->splitResponse($response); 

     if ($data['is_valid'] == "true") { 
      return true; 
     }else{ 
      return false; 
     } 
    } 
} 
?> 
+0

問題は、クラスを拡張して欠落している機能を追加することができるため、一般的に**はい**で回答できます。しかし、私はそれがあなたが求めているものではないと思います、私はあなたが探しているすべてのものを持っているクラスの新しいバージョンのダウンロードリンクを好むと思いますよね? – hakre

+1

これらの200行のコードはあなたにとって問題ではないと私は本当に思っています。それにもかかわらず、OpenID 2をサポートしたい場合。0と属性交換を行うには、別のライブラリを使用する必要があります。そして、ちょうどその行数は関係ないことを証明するために、私はあなたが使用したクラスよりも、それを小さくするlightopenidに(問題のクラスが著しく欠けているコメントそのうち半分、)いくつかのコードを削除したします。http://ペーストビン.com/fE8qT3kW。それは属性を取得するためのサポートを欠いものの、それはまだ、OpenIDの両方のバージョンをサポートしています。要約すると、LightOpenIDは複雑でも肥大でもありません。 – Mewp

答えて

2

あなたの質問内のクラスは、すべてのOpenID 2.0をサポートしていません。したがって、多くのコードを追加しなければGoogleでは動作しません。

4

問題は、GoogleがOpenIDエンドポイントを提供するだけではないということです。

OpenIdエンドポイントには、ユーザーの識別子が含まれています。

私たちがここにいるのは、ディスカバリーURLと呼ばれています。

これは任意のユーザーを誘導できる静的URLで、サービス自体がユーザーを認識し、ユーザーごとの一意の識別URLを返します。

しかし、これは公式OpenIDのウェブサイトにリンクさ過半数を含む最ものOpenIDクライアントライブラリによって正しく実装されていません。

Zend Frameworkライブラリでさえそれを処理することはできません。

しかし私はさまざまな視点から分析したクラスを見つけ、私は非常に満足しています。私が働いている会社では、すでにいくつかの実稼働環境で正常に統合されており、何の問題も経験していません。

Facebookをopenidプロバイダにするという問題を扱っている別の投稿にも興味があります。また、Googleをサポートしています私が使用しているクラスも、そこに見つけることができます:

Best way to implement Single-Sign-On with all major providers?

+0

ところで:GoogleのOpenIDのディスカバリーURLを使ってそれを正しく行うにはlightopenid縫い目...) – Rella

+0

はい、lightopenidは私も使用していたクラスです。 –

+0

私はタイトルから、私には明らかであるように見えたので、私は本当にあなたの質問をよく見てdidntの正直でなければなりません。今私はあなたがlightpeenidで働くことを嘆いているのを見ます。私はこれに研究のかなりの量を投資し、それだけに固執することをお勧めすることができます。 –

関連する問題