¿Cómo distinguir / identificar a los usuarios con OpenID sin solicitar campos SREG?
-
29-09-2019 - |
Pregunta
He estado jugando con la Biblioteca PHP JanRain OpenID, sobre todo después junto con un tutorial que encontré en ZendZone .
¿Cómo distinguir entre los usuarios - especialmente los usuarios de Google, que todos terminan usando la misma URL de OpenID, https://www.google.com/accounts/o8/id ?
Básicamente, estoy en el punto en el que puedo detectar que tienen una cuenta OpenID ... que han autenticado correctamente ... pero mi aplicación aún no sabe lo que son; solamente que se autentican.
Para distinguir a los usuarios, el tutorial usa una "solicitud de registro simple" para solicitar correo electrónico del usuario del proveedor de OpenID -. Y luego utilizar la dirección de correo electrónico para ver si esto es un usuario recurrente
No estaba funcionando para mí, y aparentemente no funcionará con algunos proveedores así que estaba emocionado cuando me encontré con un getDisplayIdentifier
función.
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.
}
Por desgracia, después de un par de horas que el valor devuelto por cambios getDisplayIdentifier
.
Solución 2
El problema era que OpenID de Google son únicos para cada dominio ; Yo había estado ausente alterna entre mindedly http://www.mysite.com
y http://mysite.com
, lo que causó la url OpenID a cambio!
Otros consejos
Skimming 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 he dejado unas cuantas horas para ver si esto cambia, así que disculpas si esto es lo que ya tenía de getDisplayIdentifier - pero rozando la fuente parece que acababa de usar la primera parte, pero entonces yo no soy PHP experto.
¿Por qué no simplemente usar la URL de OpenID para identificar a los usuarios? Consideramos que es único, como una dirección de correo electrónico.
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):
La pantalla identificador está relacionado con el identificador de reivindicada, pero el dos no siempre son idénticos. El identificador de pantalla es algo que el el usuario debe reconocer como lo que entraron, mientras que la respuesta es identificador reivindicada (en el {} identity_url atributo L) puede tener adicional información para una mejor persistencia.
URLs serán despojados de sus fragmentos para la visualización. voluntad Xris visualizar el identificador legible por humanos (i-nombre) en lugar de la identificador persistente (i-número).
El uso del identificador de visualización de su interfaz de usuario. Utilizar L {} identity_url para consultar el servidor de base de datos o autorización.
A partir de los documentos pitón-openid .