2009-08-31 6 views
17

Wenn ich mit dem Google OpenID-Anbieter Ping-Pong spiele, kann ich keinen freundlichen Namen/Spitznamen/Benutzernamen erhalten (wie immer Sie ihn nennen wollen).Freundlicher Name von Google mit OpenID?

ich etwas scheußlich aussehen wie die folgende:

www.google.com/accounts/o8/id?id=AItOawmtAnQvSXGhRTkAHZWyxi4L4EKa7xoTT1dk 

statt etwas Schönes wie

JohnDoe 

Was für immer den Namen des Benutzers von Google in einem netten, freundlichen Art und Weise das Protokoll ist wie sagen wir, myopenid tut?

** Ich verwende DotNetOpenAuth *

Antwort

13

Sie können nicht. Der Bezeichner, den das OP ausstellt, liegt ausschließlich beim OP. Die RP hat nicht wirklich etwas zu sagen. Einige OPs unterstützen jetzt das Anbieten von Attributen mit dem Login, wie zum Beispiel Nickname, E-Mail-Adresse usw. Google hat nur sehr eingeschränkte Unterstützung für diese und bietet nur E-Mail-Adressen an.

Google hat entschieden, keine vom Nutzer erkennbaren Bezeichner auszugeben, da dies ein Risiko für die Offenlegung von Informationen darstellt. Yahoo ging beide Wege, indem es Nutzern sowohl eine menschenfreundliche als auch eine nicht-menschenfreundliche Kennung anbot, zwischen denen der Nutzer wählen kann. MyOpenID und andere OPs verwenden im Allgemeinen nur eine benutzerfreundliche Kennung, die der Benutzer bei der Anmeldung am OP auswählt.

Sie möchten möglicherweise Sonderfall Google bei Ihrem RP, um eine freundlichere Zeichenfolge zu wählen, um den Benutzer anzuzeigen, wenn sie eingeloggt sind, oder da Google nicht der Einzige ist, der dies tut, Code schreiben, um herauszufinden wenn der Bezeichner nicht lesbar ist und etwas benutzerfreundlicher angezeigt wird, damit sie wissen, dass sie eingeloggt sind (vielleicht ihre E-Mail-Adresse oder ein Spitzname, den sie auf Ihrer Website auswählen).

Vorsicht: Wenn Sie eine freundlichere Kennung als die einer Google Probleme angezeigt werden, wählen Sie noch die offizielle von Google für den offiziellen Benutzernamen des Benutzers, die Sie weitergeben zu FormsAuthentication.RedirectFromLogin und für Benutzername Beansprucht Identifier verwenden müssen Nachschlagen in Ihrer Datenbank. Alles, was Sie sonst noch zusammenstellen, führt normalerweise zu Sicherheitsrisiken.

+0

Danke für die Aufräumung. Ich schätze, eine benutzerfreundliche Standardkennung, da die E-Mail des Benutzers funktionieren kann. Würdest du zufällig wissen, welche anderen Dienste in Bezug auf Freundschaftsnamen nicht nett sind? – MunkiPhD

+0

Yahoo ist der einzige andere, den ich kenne, und es hat nur manchmal dieses Verhalten. –

+1

Andrew, ich habe es geschafft, tiefer in deine Blog-Posts zu kommen und finde das in Bezug auf Yahoo. Ich muss es noch einmal lesen, um es vollständig zu verstehen - aber in meinen unwissenden Versuchen konnte ich nicht einmal eine E-Mail-Adresse von Yahoo zurückbekommen, was mich verwirrte, da ich einen Yahoo-Login für stackoverflow nutze - und meine Informationen klar übertrugen. – MunkiPhD

6

Ab 2012 scheint es, dass die Google OpenID endpoint Vor-und Nachname Abruf durch das Attribut Exchange-Protokoll unterstützt. Hier ist ein Beispiel für Python-Code, der das Pyramid-Webframework und Janrains python-openid-Paket verwendet.

from openid.consumer import consumer 
from openid.extensions.ax import AttrInfo, FetchRequest, FetchResponse 
from openid.store.filestore import FileOpenIDStore 
from openid.store.sqlstore import PostgreSQLStore, MySQLStore, SQLiteStore 

AX_FIRSTNAME = 'http://axschema.org/namePerson/first' 
AX_LASTNAME = 'http://axschema.org/namePerson/last' 
AX_EMAIL = 'http://axschema.org/contact/email' 

@view_config(route_name='openID_start', permission=NO_PERMISSION_REQUIRED) 
def start(request): 
    'Start openID authentication process' 
    params = request.params 
    openIDURL = params.get('openIDURL') 
    if not openIDURL: 
     return HTTPResponse('Parameter expected: openIDURL') 
    openIDConsumer = get_consumer(request) 
    try: 
     openIDRequest = openIDConsumer.begin(openIDURL) 
    except consumer.DiscoveryFailure, error: 
     return HTTPResponse('Discovery failed: %s' % escape(error)) 
    else: 
     if not openIDRequest: 
      return HTTPResponse('Not an openID provider: %s' % escape(openIDURL)) 

     axRequest = FetchRequest() 
     axRequest.add(AttrInfo(AX_FIRSTNAME, required=True)) 
     axRequest.add(AttrInfo(AX_LASTNAME, required=True)) 
     axRequest.add(AttrInfo(AX_EMAIL, required=True)) 
     openIDRequest.addExtension(axRequest) 

     sourceURL = request.host_url 
     targetURL = request.route_url('openID_finish') 
     if openIDRequest.shouldSendRedirect(): 
      return HTTPFound(location=openIDRequest.redirectURL(sourceURL, targetURL)) 
     return HTTPResponse(openIDRequest.htmlMarkup(sourceURL, targetURL)) 

@view_config(route_name='openID_finish', permission=NO_PERMISSION_REQUIRED) 
def finish(request): 
    'Finish openID authentication process' 
    openIDConsumer = get_consumer(request) 
    targetURL = request.route_url('openID_finish') 
    openIDResponse = openIDConsumer.complete(request.params, targetURL) 
    html = openIDResponse.status + '<br>' 
    for key, value in openIDResponse.__dict__.iteritems(): 
     html += '%s: %s<br>' % (escape(key), escape(value)) 
    html += '<br>' 
    if consumer.SUCCESS == openIDResponse.status: 
     axResponse = FetchResponse.fromSuccessResponse(openIDResponse) 
     html += 'First name: %s<br>' % escape(axResponse.get(AX_FIRSTNAME)) 
     html += 'Last name: %s<br>' % escape(axResponse.get(AX_LASTNAME)) 
     html += 'Email: %s<br>' % escape(axResponse.get(AX_EMAIL)) 
    return HTTPResponse(html) 

def get_consumer(request): 
    try: 
     openIDStore = { 
      'sqlite': SQLiteStore, 
      'postgresql': PostgreSQLStore, 
      'mysql': MySQLStore, 
     }[db.bind.name](db.bind.raw_connection()) 
    except KeyError: 
     openIDStore = FileOpenIDStore('data/openIDs') 
    try: 
     openIDStore.createTables() 
    except: 
     pass 
    return consumer.Consumer(request.session, openIDStore) 
+0

Funktioniert wie eine Bombe./namePerson/first und/namePerson/last – Spider

10

Basis auf Roy Antwort, habe ich versucht, die gleiche Aufforderung an machen DotNetOpenAuth verwenden und es funktionierte gut. der Anfrage:

var req = openid.CreateRequest("https://www.google.com/accounts/o8/id"); 
var fetch = new FetchRequest(); 
fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Contact.Email,true)); 
fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Name.First,true)); 
fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Name.Last,true)); 

req.AddExtension(fetch); 

Hinweis: Stellen Sie sicher, dass der zweite Parm von AttributeRequest Konstruktor auf true gesetzt ist.

der Antwortteil ist geradlinig.

var openid = new OpenIdRelyingParty(); 
var response = openid.GetResponse(); 
var fetch = response.GetExtension<FetchResponse>(); 
if (fetch != null) { 
IList<string> emailAddresses =fetch.Attributes[WellKnownAttributes.Contact.Email].Values; 
IList<string> firstNames = fetch.Attributes[WellKnownAttributes.Name.First].Values; 
IList<string> lastName = fetch.Attributes[WellKnownAttributes.Name.Last].Values; 
} 
+0

Je nachdem, wie Sie dies verwenden (ich verwende OWIN), verfügen Sie möglicherweise nicht über WellKnownAttributes in der Menge der in Ihrem Projekt installierten Dinge, und wahrscheinlich möchten Sie DotNetOpenAuth nicht hinzufügen nur dafür. Hier sind die OpenId-Zeichenfolgen in ihren WellKnownAttributes (und anderswo in anderen OpenId-Bibliotheken): Vorname: "Given_name", Nachname: "Family_name", zweiter Vorname: "Middle_name", Nickname: "Nickname" –