Rails: la récupération de l'image de Facebook après Omniauth la connexion avec Concevoir
J'ai installé Facebook connexion avec Concevoir et omniauth avec ces instructions https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
Le Concevoir wiki donne des instructions pour l'obtention de facebook info à partir de la table de hachage stockée dans cette variable request.env['omniauth.auth']
Voir en bas pour le hachage.
Par exemple, Concevoir wiki est de ces deux méthodes pour la User.rb
modèle
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
Donc, en utilisant le hachage ci-dessous, j'ai ajouté la suite de ces deux méthodes pour obtenir le nom et l'image
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
Alors de mon point de vue, j'ai ajouté ce qui suit pour afficher le nom de l'utilisateur et de l'image
<p>Name:<%= user.name %></p>
<p>Image: <%= image_tag user.image %>
Cependant, seul le nom est à l'affiche. Pas d'image.
Dans ma base de données, j'ai un name
et un image
colonne. Le nom de Facebook est stockée, mais l'image de la colonne dit "nil"
Des idées comment je peux obtenir l'image à travailler?
Hash stocké dans 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
Vous devez vous connecter pour publier un commentaire.
L'image peut être trouvé à
env["omniauth.auth"]["info"]["image"]
. Donc dans votre cas,access_token.info.image
.Si vous voulez prendre un bon coup d'oeil à la table de hachage de imbriquée hachages retourné et de voir par vous-même, où tout est, de mettre ce que la première ligne de votre rappel de contrôleur:
EDIT: Ok, alors, voici ce que vous devez faire:
Comme pour l'autre méthode, si je ne me trompe pas, il devrait ressembler à ceci:
Mais lorsque cette méthode est-elle utilisée? Il est utilisé par Concevoir quand quelque chose se passe mal lors de la création de votre utilisateur. Imaginez que le fournisseur d'authentification ne vous donne pas un e-mail (Twitter, par exemple, est-ce le), que pouvez-vous faire? Eh bien, vous pouvez rediriger l'utilisateur vers votre page d'inscription où il peut compléter le processus d'inscription. Mais si vous rediriger l'utilisateur, vous perdez les données reçues par le protocole oauth. La solution est de mettre ces données dans la session.
Dans votre contrôleur, vous devriez avoir quelque chose comme:
Un autre problème, cependant, est que la plupart du temps, les données renvoyées par le fournisseur d'authentification est trop gros pour rentrer dans la session, nous avons donc à choisir exactement ce que nous voulons mettre dans la session. Puisque vous êtes seulement un nom et une image, vous pouvez couper la petite info comme ça:
new_with_session
méthode. Vous pouvez également supprimer leelse
branche qui redirige l'utilisateur vers une autre page.