ruby on rails - google - Rails: recuperando imágenes de Facebook después de iniciar sesión en Omniauth con Devise
rails devise generate views (1)
Configuré el inicio de sesión de Facebook con Devise y omniauth con estas instrucciones https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
La wiki de Devise da algunas instrucciones para obtener información de Facebook del hash almacenado en esta variable request.env[''omniauth.auth'']
Vea la parte inferior del hash.
Por ejemplo, Devise wiki tiene estos dos métodos para el modelo User.rb
def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
data = access_token.extra.raw_info
if user = User.where(:email => data.email).first
user
else # Create a user with a stub password.
User.create!(:email => data.email, :password => Devise.friendly_token[0,20])
end
end
def self.new_with_session(params, session)
super.tap do |user|
if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"]
user.email = data["email"]
end
end
end
Entonces, usando el hash a continuación, agregué lo siguiente a esos dos métodos para obtener el nombre y la imagen
def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
data = access_token.extra.raw_info
if user = User.where(:email => data.email).first
user
else # Create a user with a stub password.
User.create!(:email => data.email, :password => Devise.friendly_token[0,20], :name => data.name, :image => access_token.info.image) #I added access_token.info.image based on first answer
end
end
def self.new_with_session(params, session)
super.tap do |user|
if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"]
user.email = data["email"]
user.name = data["name"]
user.image = access_token.info.image #i changed this based on first answer below
end
end
end
Luego, en mi opinión, agregué lo siguiente para mostrar el nombre de usuario y la imagen
<p>Name:<%= user.name %></p>
<p>Image: <%= image_tag user.image %>
Sin embargo, solo se muestra el nombre. Sin imágen.
En mi base de datos, tengo un name
y una columna de image
. El nombre de Facebook se está almacenando, pero la columna de la imagen dice ''nil''
¿Alguna idea de cómo puedo conseguir que la imagen funcione?
Hash almacenado en request.env[''omniauth.auth'']
https://github.com/mkdynamic/omniauth-facebook/blob/master/lib/omniauth/strategies/facebook.rb#L31-47
info do
prune!({
''nickname'' => raw_info[''username''],
''email'' => raw_info[''email''],
''name'' => raw_info[''name''],
''first_name'' => raw_info[''first_name''],
''last_name'' => raw_info[''last_name''],
''image'' => "#{options[:secure_image_url] ? ''https'' : ''http''}://graph.facebook.com/#{uid}/picture?type=square",
''description'' => raw_info[''bio''],
''urls'' => {
''Facebook'' => raw_info[''link''],
''Website'' => raw_info[''website'']
},
''location'' => (raw_info[''location''] || {})[''name''],
''verified'' => raw_info[''verified'']
})
end
La imagen se puede encontrar en env["omniauth.auth"]["info"]["image"]
. Así que en tu caso, access_token.info.image
.
Si desea ver bien el hash de hashes anidados devueltos y ver por sí mismo dónde está todo, ponga esto como la primera línea de su controlador de devolución de llamada:
render :text => "<pre>" + env["omniauth.auth"].to_yaml and return
EDIT: Ok, entonces esto es lo que necesitas hacer:
def self.find_for_facebook_oauth(omniauth)
if user = User.find_by_email(omniauth.info.email)
if omniauth.info.image.present?
user.update_attribute(:image, omniauth.info.image)
end
user
else # Create a user with a stub password.
User.create!(:email => omniauth.info.email,
:name => omniauth.info.name,
:image => omniauth.info.image,
:password => Devise.friendly_token[0,20])
end
end
En cuanto al otro método, si no me equivoco, debería verse así:
def self.new_with_session(params, session)
super.tap do |user|
if omniauth = session["devise.facebook_data"]
user.email = omniauth.info.email
user.name = omniauth.info.name
user.image = omniauth.info.image
end
end
end
Pero, ¿cuándo se usa este método? Devise lo utiliza cuando algo va mal al crear su usuario. Imagina que el proveedor de autenticación no te da un correo electrónico (Twitter, por ejemplo, hace esto), ¿qué puedes hacer? Bueno, puede redirigir al usuario a su página de registro donde puede completar el proceso de registro. Pero si redirecciona al usuario, perderá los datos recibidos por el usuario. La solución es poner estos datos en la sesión.
Entonces en tu controlador, deberías tener algo como:
if user.save
sign_in_and_redirect user, :event => :authentication
else
session["devise.facebook_data"] = env["omniauth.auth"]
redirect_to new_user_registration_url
end
Sin embargo, otro problema es que la mayoría de las veces los datos devueltos por el proveedor de autenticación son demasiado grandes para que quepan en la sesión, por lo que tenemos que elegir exactamente lo que queremos incluir en la sesión. Ya que solo está obteniendo un nombre y una imagen, puede recortar la información adicional así:
session["devise.facebook_data"] = env["omniauth.auth"].except(''extra'')