2010-06-24 26 views
5

He estado jugando con la biblioteca de PHP de OpenID de JanRain, la mayoría siguiendo junto con a tutorial I found on ZendZone.¿Cómo distinguir/identificar usuarios con OpenID sin solicitar campos SReg?

¿Cómo se distingue entre los usuarios, especialmente los usuarios de Google, que terminan usando la misma URL de OpenID, https://www.google.com/accounts/o8/id?

Básicamente, estoy en el punto donde puedo detectar que tienen una cuenta OpenID ... que se han autenticado con éxito ... pero mi aplicación aún no sabe quiénes son; solo que ellos autenticaron.

Para distinguir a los usuarios, el tutorial utiliza una "Solicitud de registro simple" para solicitar el correo electrónico del usuario del proveedor de OpenID y luego usa la dirección de correo electrónico para ver si este es un usuario recurrente.

No funcionó para mí, y apparently won't work with some providers, así que estaba emocionado cuando me encontré con una función getDisplayIdentifier.

require_once "Auth/OpenID/Consumer.php"; 
require_once "Auth/OpenID/FileStore.php"; 
// create file storage area for OpenID data 
$store = new Auth_OpenID_FileStore('/wtv'); 
$consumer = new Auth_OpenID_Consumer($store); 
$oid_response = $consumer->complete("http://example.com/oir_return"); 
if ($oid_response->status == Auth_OpenID_SUCCESS) { 
    $hopefullyUniqueUserID = $oid_response->getDisplayIdentifier(); // I assumed this would be a relatively permanent way to identify the user... 
              // I was wrong. 
} 

Desafortunadamente, después de un par de horas que el valor devuelto por getDisplayIdentifier cambios.

+0

Lea la especificación con cuidado. 'https: // www.google.com/accounts/o8/id' es el identificador proporcionado por el usuario, el usuario no afirma necesariamente que lo posee, su propósito puede ser simplemente guiar al usuario para seleccionar un identificador, como es el caso con Google. – Artefacto

Respuesta

2

El problema fue que Google's OpenIDs are Unique Per-Domain; ¡Había estado distraído alternando entre http://www.mysite.com y http://mysite.com, lo que causó que la URL de identidad de OpenID cambiara!

1

¿Por qué no utilizar simplemente la URL de OpenID para identificar a los usuarios? Considérelo único como una dirección de correo electrónico.

+0

Pensé que así era también, pero dice que está viendo a todos los usuarios de Google desde la misma URL de OpenID. – Rup

+0

Al igual que yo, pero las cuentas de Google siempre tienen 'https://www.google.com/accounts/o8/id ' como su URL. –

+0

ah, se perdió esa parte. – Echo

5

Rozando el código, creo que es $oid_response->identity_url que desea. Para mí (aunque en DotNetOpenAuth no php-openid) que regresa como

https://www.google.com/accounts/o8/id?id=AItOawmqjknrgk6f9cNdPIVxW43GewJPa1ZW4GE

de Google, donde la parte de identificación es reproducible y es de esperar único para mí. Sin embargo, no lo he dejado en unas pocas horas para ver si esto cambia, así que le pido disculpas si esto es lo que ya tenía de getDisplayIdentifier, pero al analizar la fuente parece que usaría la primera parte, pero luego no estoy Experto en PHP

+0

Eso es idéntico a lo que '$ oid_response-> getDisplayIdentifier()' me dio ... y lo dejé en unas pocas horas y cambió: '(Sin embargo, lo intentaré. –

+0

Ah, OK - perdón. – Rup

+0

+ 1 - verificado después de unas horas, no parece estar cambiando ... –

1

De acuerdo con el último párrafo a continuación, que sin duda debe utilizar el atributo identity_url del objeto respuesta (de acuerdo, esto es en referencia a la biblioteca de Python, pero las implementaciones son muy similar):

El identificador de visualización está relacionado con el Identificador Reclamado, pero los dos no son siempre idénticos. El identificador de pantalla es algo que el usuario debe reconocer como lo que ingresó, mientras que el identificador reclamado de la respuesta (en el atributo L {identity_url}) puede tener información adicional para una mejor persistencia.

Las URL se despojarán de sus fragmentos para su visualización. Los XRI mostrarán el identificador legible por el ser humano (i-name) en lugar del identificador persistente (número i).

Use el identificador de pantalla en su interfaz de usuario. Use L {identity_url} para consultar su base de datos o servidor de autorización.

A partir del python-openid docs.

Cuestiones relacionadas