2010-06-24 6 views
5

Ho giocato con la libreria PHP di JanRain OpenID, principalmente seguendo lo a tutorial I found on ZendZone.Come distinguere/identificare gli utenti con OpenID senza richiedere campi SReg?

Come si fa a distinguere tra gli utenti, in particolare gli utenti di Google, che finiscono per utilizzare lo stesso URL OpenID, https://www.google.com/accounts/o8/id?

Fondamentalmente, sono al punto in cui posso rilevare che hanno un account OpenID ... che sono stati autenticati con successo ... ma la mia app ancora non sa chi sono; solo che sono autenticati.

Per distinguere gli utenti, il tutorial utilizza una "Richiesta di registrazione semplice" per richiedere l'e-mail dell'utente del provider OpenID e quindi utilizzare l'indirizzo di posta elettronica per verificare se si tratta di un utente che ritorna.

Non funzionava per me e apparently won't work with some providers quindi ero eccitato quando mi sono imbattuto in una funzione 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. 
} 

Purtroppo, dopo un paio d'ore, il valore restituito da getDisplayIdentifier cambiamenti.

+0

Si prega di leggere attentamente le specifiche. 'https: // www.google.com/accounts/o8/id' è l'identificatore fornito dall'utente, l'utente non afferma necessariamente di possederlo, il suo scopo potrebbe essere solo guidare l'utente a selezionare un identificatore, come lo è il caso con Google. – Artefacto

risposta

2

Il problema era che Google's OpenIDs are Unique Per-Domain; Sono stato assente alternando tra http://www.mysite.com e http://mysite.com, che ha causato la modifica dell'URL di identità di OpenID!

1

Perché non utilizzare semplicemente l'URL OpenID per identificare gli utenti? Consideralo unico come un indirizzo email.

+0

Ho pensato che fosse così anche, ma dice che sta vedendo tutti gli utenti di Google dallo stesso URL OpenID. – Rup

+0

Come ho fatto io, ma gli account Google hanno sempre "https://www.google.com/accounts/o8/id " come loro URL. –

+0

ah, ho perso quella parte. Lo stackoverflow – Echo

5

Scremando il codice, penso che sia $oid_response->identity_url che si desidera. Per me (anche se in DotNetOpenAuth non php-OpenID), che ritorna come

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

da parte di Google, dove la parte ID è riproducibile e, auspicabilmente, unico per me. Tuttavia non ho lasciato alcune ore per vedere se questo cambia, quindi scuse se questo è quello che hai già da getDisplayIdentifier - ma sfiorando l'origine sembra che userebbe solo la prima parte, ma poi non sono Esperto PHP.

+0

Questo è identico a ciò che '$ oid_response-> getDisplayIdentifier()' mi ha dato ... e l'ho lasciato poche ore e ha cambiato: '(Comunque, ci proverò –

+0

Ah, OK - mi dispiace – Rup

+0

+ 1 - controllato dopo poche ore, non sembra che stia cambiando ... –

1

Secondo l'ultimo paragrafo di seguito, si dovrebbe assolutamente utilizzare l'attributo identity_url dell'oggetto risposta (concesso, questo è in riferimento alla libreria Python, ma le implementazioni sono molto simile):

L'identificatore di visualizzazione è correlato all'identificatore rivendicato, ma i due non sono sempre identici. L'identificativo del display è qualcosa che l'utente di dovrebbe riconoscere come inserito, mentre l'identificativo della risposta della risposta (nell'attributo L {identity_url}) potrebbe avere ulteriori informazioni per una migliore persistenza.

Gli URL verranno rimossi dai loro frammenti per la visualizzazione. Gli XRI visualizzano l'identificativo leggibile dall'uomo (i-name) anziché l'identificativo persistente (numero-i).

Utilizzare l'identificativo del display nell'interfaccia utente. Utilizzare L {identity_url} per interrogare il database o il server di autorizzazione.

dallo python-openid docs.

Problemi correlati