2009-04-25 16 views
10

Estoy jugando con el authlogic-example-app y no obtengo la dirección de correo electrónico del proveedor de OpenID (en mi caso: Google y Yahoo) cuando registro un usuario, resp. Recibo una respuesta vacía en lugar de una dirección de correo electrónico (verifique los comentarios en el código a continuación).Ruby-OpenID: que requiere dirección de correo electrónico del proveedor de OpenID

Así es como se ve mi modelo de usuario (todo lo demás se parece a la rama "with_openid" de la aplicación authlogic-example-app mencionada anteriormente). Además de la 'e-mail' que falta, la autenticación de OpenID proceso funciona como se esperaba:

class User < ActiveRecord::Base 
    acts_as_authentic do |c| 
    # not needed because I use OpenID 
    c.validate_login_field = false 
    # avoid failed validation before OpenID request 
    c.validate_email_field = false 
    # this one sets 'openid.sreg.required=email' 
    c.required_fields = [:email] 
    end 

    private 

    # overwriting the existing method in '/lib/authlogic_openid/acts_as_authentic.rb' 
    def map_openid_registration(registration) 
    # this is my problem: 'registration' is an empty hash 
    self.email ||= registration[:email] if respond_to?(:email) && !registration[:email].blank? 
    end 

end 

alguna idea de cómo resolver esto? ¿Alguien ha hecho esto antes de usar authlogic? O aún mejor: ¿tiene un ejemplo de trabajo?

actualización: he comprobado la Google Account Authentication API y se compara la solicitud presentada por authlogic (usando ruby-openid-gem y openid-authentication-plugin) con el example requests en los documentos de la API de autenticación de la cuenta de Google:


Ejemplo petición para autenticar a buscar dirección de correo electrónico de Google:

https://www.google.com/accounts/o8/ud 
?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 
&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.return_to=http%3A%2F%2Fwww.example.com%2Fcheckauth 
&openid.realm=http%3A%2F%2Fwww.example.com%2F 
&openid.assoc_handle=ABSmpf6DNMw 
&openid.mode=checkid_setup 
&openid.ns.ext1=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0 
&openid.ext1.mode=fetch_request 
&openid.ext1.type.email=http%3A%2F%2Faxschema.org%2Fcontact%2Femail 
&openid.ext1.required=email 

solicitud presentada por mi appliation:

https://www.google.com/accounts/o8/ud 
?openid.assoc_handle=AOQobUcdICerEyK6SXJfukaz8ygXiBqF_gKXv68OBtPXmeafBSdZ6576 
&openid.ax.mode=fetch_request 
&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.mode=checkid_setup 
&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 
&openid.ns.ax=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0 
&openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1 
&openid.realm=http%3A%2F%2Flocalhost%3A3000%2F 
&openid.return_to=http%3A%2F%2Flocalhost%3A3000%2Faccount%3Ffor_model%3D1%26_method%3Dpost%26open_id_complete%3D1 
&openid.sreg.required=email 

Mientras se depura la configuración de todo, he descubierto que el openid-authentication-plugin nunca recibe un correo electrónico en la respuesta que recibe del proveedor de OpenID, esto por lo menos explica por qué el registration de hash en mi usuario se encuentra vacío ...

ACTUALIZACIÓN: Si usted está jugando con authlogic y openid, no se olvide de revisar la latest railscast on this subject!

Respuesta

10

Como nadie podría ayudarme, me ayudé a mí mismo. :-)

La respuesta corta a mi pregunta es:

c.required_fields = [:email,"http://axschema.org/contact/email"] 

Usando esta línea, la aplicación solicita la dirección de correo electrónico utilizando SREG y el hacha (de tipo petición apoyada por Google).

puede encontrar una respuesta más detallada y una implementación funcional de authlogic-openid con el Javascript OpenID-Selector aquí:

http://github.com/vazqujav/authlogic_openid_selector_example/

+0

Recibo errores cuando estos campos están habilitados ... método indefinido 'required_fields = 'for # ... sin ellos: # c.required_fields = ["http://axschema.org/contact/email"] # recuperar correo electrónico por sreg # c.optional_fields = ["email"] funciona. – holden

+0

@holden: Me dirigí a esto como respuesta al problema github que enviaste. – Javier

+0

También podría estar interesado en este fork, que (según el README) está destinado a tratar algunas opciones de SReg versus AX: https://github.com/binaryfeed/open_id_authentication - No estoy seguro de que realmente responda a su pregunta, per se, parece relevante para el tema. – lindes

0

Prueba contra un servidor OpenID que controle, ya que le permitirá depurar cada parte de la secuencia OpenID. No hay garantías de que el proveedor de OpenID de Google esté haciendo lo correcto. Intente verificar con el servidor de Verisign, ya que estoy bastante seguro de que al menos debería hacer lo correcto con el campo openid.sreg.required=email.

Su fragmento de código se ve bien para mí.

3

Si bien esto me señaló en la dirección correcta, lo que necesitaba era:

c.openid_required_fields = [:email,"http://axschema.org/contact/email"] 

Esto retiró el correo electrónico y lo configuró.

2
# fetch email by ax 
c.openid_required_fields = [ 
          "http://axschema.org/contact/email", 
          "http://axschema.org/namePerson/first", 
          "http://axschema.org/namePerson/last", 
          "http://axschema.org/contact/country/home", 
          "http://axschema.org/pref/language" 
          ] 

Esto obtiene en múltiples valores como se especifica @http://code.google.com/apis/accounts/docs/OpenID.html#Parameters

Aunque todavía estoy No es posible obtener en el nombre del país ... nombre, correo electrónico, el lenguaje funciona perfectamente!

0

la cosa es que soy capaz de obtener los parámetros del proveedor pero no soy capaz de extraerlos de la respuesta ... he utilizado OpenID :: :: AX FetchResponse.from_success_response (open_id_response) como el objeto para mantener la respuesta ... qué método utilizo para extraer el correo electrónico, el apodo, el país, etc.

Cuestiones relacionadas