2010-06-24 1 views
5

Ich spielte mit der JanRain OpenID PHP Library, meistens zusammen mit a tutorial I found on ZendZone.Wie kann man Benutzer mit OpenID unterscheiden/identifizieren, ohne SReg-Felder anzufordern?

Wie unterscheidet man Benutzer - insbesondere Google-Nutzer, die alle die gleiche OpenID-URL verwenden, https://www.google.com/accounts/o8/id?

Grundsätzlich bin ich an dem Punkt, wo ich erkennen kann, dass sie ein OpenID-Konto haben ... das sie erfolgreich authentifiziert haben ... aber meine App weiß immer noch nicht wer sie sind; nur dass sie authentifiziert haben.

Um die Benutzer zu unterscheiden, verwendet das Lernprogramm eine "Einfache Registrierungsanforderung", um die E-Mail des Benutzers des OpenID-Anbieters anzufordern - und dann die E-Mail-Adresse zu verwenden, um festzustellen, ob es sich um einen wiederkehrenden Benutzer handelt.

Es war nicht für mich arbeiten, und apparently won't work with some providers so war ich aufgeregt, als ich auf eine Funktion stolperte 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. 
} 

Leider nach ein paar Stunden der Wert von getDisplayIdentifier Änderungen zurückgegeben.

+0

Bitte lesen Sie die Spezifikation sorgfältig. "https: // www.google.com/accounts/o8/id" ist die vom Nutzer angegebene ID, der Benutzer muss nicht unbedingt angeben, dass er Eigentümer der ID ist, sein Zweck kann den Nutzer lediglich dazu veranlassen, eine ID auszuwählen, wie dies auch der Fall ist Fall mit Google. – Artefacto

Antwort

2

Das Problem war, dass Google's OpenIDs are Unique Per-Domain; Ich war abwesend abwesend abwechselnd zwischen http://www.mysite.com und http://mysite.com, die die OpenID Identitätsurl verursachte, um zu ändern!

1

Warum nicht einfach die OpenID-URL verwenden, um Benutzer zu identifizieren? Betrachten Sie es als eine E-Mail-Adresse einzigartig.

+0

Ich dachte, so funktioniert es auch, aber er sagt, dass er alle Google-Nutzer von derselben OpenID-URL sieht. – Rup

+0

Wie ich, aber Google-Konten haben immer 'https://www.google.com/accounts/o8/id ' als ihre URL. –

+0

ah, verpasste diesen Teil. – Echo

5

Skimming den Code, ich denke, es ist $oid_response->identity_url, die Sie wollen. Für mich (wenn auch in DotNetOpenAuth nicht php-openid), die

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

von Google, wo der ID-Teil ist reproduzierbar und hoffentlich einzigartig für mich zurück, wie kommt. Allerdings habe ich es nicht ein paar Stunden gelassen, um zu sehen, ob sich das ändert, also entschuldige, wenn du das schon von getDisplayIdentifier hast - aber die Quelle überspringend, sieht es so aus, als würde sie nur den ersten Teil benutzen, aber dann bin ich nicht PHP-Experte.

+0

Das ist identisch mit dem, was '$ oid_response-> getDisplayIdentifier()' gab mir ... und ich ließ es ein paar Stunden und es änderte: '(Trotzdem werde ich es versuchen. –

+0

Ah, OK - sorry. – Rup

+0

+ 1 - nach ein paar Stunden überprüft, scheint sich nicht zu ändern ... –

1

Nach dem letzten Absatz unten, Sie auf jeden Fall das identity_url Attribut des Antwortobjekts verwendet werden sollen (gewährt, ist dies auf die Python-Bibliothek in Bezug, aber die Implementierungen sind sehr ähnlich):

Die Anzeigen-ID bezieht sich auf die Beansprucht-ID, aber die zwei sind nicht immer identisch. Die Anzeigen-ID ist etwas, das der Benutzer als Eingabe erkennen sollte, während die Antwort der beanspruchten Kennung (im L {identity_url} -Attribut) möglicherweise zusätzliche Informationen für eine bessere Persistenz hat.

URLs werden ihrer Fragmente für die Anzeige entfernt. XRIs zeigen die lesbare Kennung (i-name) anstelle der persistenten Kennung (i-Nummer) an.

Verwenden Sie die Anzeigenkennung in Ihrer Benutzerschnittstelle. Verwenden Sie L {identity_url} zum Abfragen Ihrer Datenbank oder Ihres Autorisierungsservers.

Von der python-openid docs.

Verwandte Themen