Rails: uso de OmniAuth (autorización FB), lectura de datos del hash de Facebook

Usando OmniAuth, obtuve con éxito los datos de hash de Facebook: almacenados en “auth”

# extra=#] last_name="Jordan" link="http://www.facebook.com/michael" locale="en_US" middle_name="Ball" name="Michael Jordan" quotes="\"lalala\"\n\n\"lala\"" timezone=9 updated_time="2011-09-01T20:25:58+0000" username="mjordan82" verified=true>> info=# verified=true> provider="facebook" uid="123456879"> 

En User Model, hago lo siguiente:

 def self.create_with_omniauth(auth) create! do |user| user.provider = auth["provider"] user.uid = auth["uid"] user.name = auth["name"] end end 

Cuando verifiqué la base de datos, solo obtuve proveedor y uid. La fila de nombre de usuario estaba vacía. A partir de las pruebas, descubrí que no podía almacenar más datos que el proveedor y el uid. Por ejemplo, user.name = auth [“provider”] o user.name = auth [“uid”] almacenado sin problemas, pero cuando intenté algo como user.name = auth [“timezone”] o user.name = auth [“last_name”], no se almacenó nada en la variable. Alguien sabe como arreglar esto? También probé user.name = auth [“user_info”] [“name”], pero devolvió un error.

No estoy seguro de por qué user.name = auth [“name”] no almacena nada. En otras palabras, ¿por qué es auth [“nombre”] no “Michael Jordan” en este caso?

La clave era esta: estaba accediendo al autenticación hash de manera incorrecta. La respuesta es que tu

 user.name = auth["info"]["name"] 

Aquí hay información detallada sobre el Hash de autenticación:

 :provider => 'facebook', :uid => '1234567', :info => { :nickname => 'jbloggs', :email => 'joe@bloggs.com', :name => 'Joe Bloggs', :first_name => 'Joe', :last_name => 'Bloggs', :image => 'http://graph.facebook.com/1234567/picture?type=square', :urls => { :Facebook => 'http://www.facebook.com/jbloggs' }, :location => 'Palo Alto, California', :verified => true }, :credentials => { :token => 'ABCDEF...', # OAuth 2.0 access_token, which you may wish to store :expires_at => 1321747205, # when the access token expires (it always will) :expires => true # this will always be true }, :extra => { :raw_info => { :id => '1234567', :name => 'Joe Bloggs', :first_name => 'Joe', :last_name => 'Bloggs', :link => 'http://www.facebook.com/jbloggs', :username => 'jbloggs', :location => { :id => '123456789', :name => 'Palo Alto, California' }, :gender => 'male', :email => 'joe@bloggs.com', :timezone => -8, :locale => 'en_US', :verified => true, :updated_time => '2011-11-11T06:21:03+0000' } 

fuente: https://github.com/mkdynamic/omniauth-facebook

Por eso pude acceder al “proveedor” y al “uid” simplemente con autenticación [“proveedor”], y tenía que hacerlo

 auth["info"]["name"] 

para acceder a la información del nombre.

Del mismo modo, para obtener la zona horaria del usuario, podría hacer

 auth["extra"]["timezone"]