with team google develop auth openid dotnetopenauth

openid - team - google login auth api



Nombre amigable de Google usando OpenID? (3)

A partir de 2012, parece que el punto final de OpenID de Google admite la recuperación de nombres y apellidos a través del protocolo de intercambio de atributos. Aquí hay un ejemplo de código Python que usa el marco web de Pyramid y el paquete python-openid .

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)

Cuando juego ping-pong con el proveedor de OpenID de Google, no puedo obtener un nombre descriptivo / apodo / nombre de usuario (como quiera que lo llamemos).

Me sale algo atroz como el siguiente:

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

en lugar de algo agradable como

JohnDoe

¿Cuál es el protocolo para obtener el nombre del usuario de Google de una manera amigable como, por ejemplo, myopenid?

** Estoy usando DotNetOpenAuth *


En base a la respuesta de Roy, traté de hacer la misma solicitud con DotNetOpenAuth y funcionó bien. la solicitud:

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);

nota: asegúrese de que el segundo parámetro del constructor AttributeRequest esté establecido en verdadero.

La parte de respuesta es sencilla.

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; }


Usted no puede El identificador que emite el OP depende estrictamente del OP. El RP realmente no tiene nada que decir en ello. Ahora, algunos operadores operativos admiten atributos con el inicio de sesión, como el apodo, la dirección de correo electrónico, etc. Google tiene un soporte muy limitado para estos, ofreciendo solo direcciones de correo electrónico.

Google decidió no emitir identificadores reconocibles por el usuario porque es un riesgo de divulgación de información. Yahoo tomó ambas rutas al ofrecer a los usuarios identificadores amigables con los humanos y no amigables con los que el usuario puede elegir. MyOpenID y otros OP suelen ir solo con un identificador fácil de usar que el usuario elige cuando se registra en el OP.

Es posible que desee un caso especial de Google en su RP para elegir una cadena más fácil de mostrar para el usuario cuando está conectado, o ya que Google no es el único que hace esto, escriba un código para averiguar cuándo está el identificador ilegibles y muestran algo más amigable para el usuario para que sepan que han iniciado sesión (tal vez su dirección de correo electrónico o el apodo que elijan en su sitio).

Precaución : si elige mostrar un identificador más amigable que los problemas de Google, aún debe usar el Identificador de FormsAuthentication.RedirectFromLogin oficial de Google para el nombre de usuario oficial del usuario que pasa a FormsAuthentication.RedirectFromLogin y para la búsqueda de nombre de usuario en su base de datos. Cualquier otra cosa que usted junte generalmente presenta riesgos de seguridad.