2011-11-18 17 views
6

Quiero implementar un sistema de inicio de sesión de OpenID con la última versión de LightOpenID. Estoy probando el ejemplo proporcionado con el código fuente línea por línea (acabo de reemplazar localhost con $_SERVER['HTTP_HOST'] en el constructor).El código de inicio de sesión de OpenID falla en el servidor activo

El problema es que todo funciona bien en mi caja de desarrollo dentro de una red privada (PHP/5.3.6 en Windows Vista) pero la validación siempre falla en mi servidor de vida en la red pública HSP (PHP/5.3.3 en CentOS)

He añadido var_dump() 's alrededor y puedo decir que ambas copias del código producen exactamente los mismos parámetros de solicitud y reciben exactamente los mismos parámetros de respuesta (a través de GET). Solo openid.assoc_handle, openid.sig, openid.response_nonce y openid.return_to tienen valores diferentes, lo que supongo que es el comportamiento esperado.

Sin embargo, mi caja dev recibe esto desde el proveedor de OpenID (no importa que uno que yo uso):

is_valid:true 
ns:http://specs.openid.net/auth/2.0 

... y mi zorro vivo recibe esta:

is_valid:false 
ns:http://specs.openid.net/auth/2.0 

Aren No se trata de ningún carácter no ASCII, por lo que no puede tratarse de un problema de codificación. Debe haber algo mal en mi servicio de alojamiento, pero no puedo entender qué.

Necesito sugerencias sobre posibles causas y consejos para la solución de problemas.

Respuesta

11

He aislado el problema y he encontrado una solución. El método request() hace algunos auto-detección para averiguar cómo stablecer conexiones HTTP:

protected function request($url, $method='GET', $params=array(), $update_claimed_id=false) 
{ 
    if (function_exists('curl_init') 
     && (!in_array('https', stream_get_wrappers()) || !ini_get('safe_mode') && !ini_get('open_basedir')) 
    ) { 
     return $this->request_curl($url, $method, $params, $update_claimed_id); 
    } 
    return $this->request_streams($url, $method, $params, $update_claimed_id); 
} 

En mi caja dev es utiliza CURL pero en mi cuadro vivo que utiliza file_get_contents() debido a que la comprobación falla. El motivo es que la directiva open_basedir no está vacía.

Si forzo a LightOpenID a usar CURL, todo funciona sin problemas.


Actualización # 1: LightOpenID tenía razón al decidir que el rizo no era utilizable. He encontrado esto en el archivo de registro:

CURLOPT_FOLLOWLOCATION no puede activarse cuando safe_mode está activado o un open_basedir se establece

cuanto a la versión file_get_contents(), sospecho que he encontrado una errata en el biblioteca:

Index: lightopenid/openid.php 
=================================================================== 
--- lightopenid/openid.php (0.60) 
+++ lightopenid/openid.php (working copy) 
@@ -349,7 +349,7 @@ 
      $this->headers = $this->parse_header_array($http_response_header, $update_claimed_id); 
     } 

-  return file_get_contents($url, false, $context); 
+  return $data; 
    } 

    protected function request($url, $method='GET', $params=array(), $update_claimed_id=false) 

He notificado al autor y ha confirmado que es un error. Informaré si se soluciona.

Actualización # 2: El errorwas fixed en la rama principal en junio de 2012. Todavía no es parte de la versión estable, pero se puede descargar desde la code repository.

+0

Gracias por la corrección. Aunque está duplicado, me pregunto por qué la segunda llamada a file_get_contents ($ url, false, $ context) que es igual a $ data no funciona. – neobie

+2

Supongo que solo puede validar una llamada exitosamente por razones de seguridad. –

+0

Se llama 'nonce' por alguna razón. Es un token de una sola vez. – Maerlyn

0

Solo una foto en la oscuridad, pero cuando trabajé con OpenID (no con Lightopenid) sino con una biblioteca para CodeIgniter, tuve un problema similar cuando mis permisos no estaban configurados correctamente para la carpeta nonce cache. Tal vez es un simple problema de permiso para el almacenamiento?

+0

Por lo que sé, LightOpenID no utiliza almacenamiento. Pero he encontrado una diferencia: el servidor en vivo no parece tener disponible CURL y LightOpenID utiliza 'file_get_contents()' en su lugar. Trataré de averiguar si es relevante. –

Cuestiones relacionadas