2015-10-12 7 views
7

Ich implementiere nun Omniumuth-Funktion in meine App. Alles funktioniert gut, außer dass ich den Vor- und Nachnamen von Facebook nicht bekommen kann. Hier ist mein Modellcode.Felder first_name und last_name von facebook omniauth erhalten

def self.from_omniauth(auth) 
    user = User.where(email: auth.info.email).first 
    if user 
     return user 
    else 
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.first_name = auth.info.first_name 
     user.last_name = auth.info.last_name 
     user.email = auth.info.email 
     user.image = auth.info.image 
     user.password = Devise.friendly_token[0,20] 
     end 
    end 

ich bereits die starke Parameter Setup für devise richtig haben, wie verwende, dass jetzt die Authentifizierung für Standard und ist properly.Is es zusätzliche Berechtigungen, die Vor- und Nachnamen von Facebook zu arbeiten?

Antwort

23

Nach etwas herumspielen fand ich die Lösung. Jetzt denke ich, wir müssen explizit die Felder verlangen, die wir benötigen. Für mich ist das Update nur first_name und last_name zu facebook hinzuzufügen.

In meinem initializers habe ich first_name und last_name zu info fields hinzugefügt.

info_fields: 'email, first_name, last_name' 

aktualisieren

Meine volle Konfigurationsdatei wird nun wie folgt aussehen

config.omniauth :facebook, ENV["FACEBOOK_APP_ID"], ENV["FACEBOOK_SECRET"], scope: 'email', info_fields: 'email, first_name, last_name' 
+0

Interessant! Welches Juwel benutzt du? Wir verwenden https://rubygems.org/gems/omniauth-facebook/versions/2.0.1 und müssen das nicht tun. – seddy

+0

Ich weiß nicht warum ... Ich benutze gem "omniauth-facebook" – Abhilash

+0

Seltsam, froh, dass Sie es aber gelöst :). Wo hast du diesen Hinweis auf 'info_fields' gefunden? – seddy

1

Von der Überprüfung der Facebook docs, die first_name und last_name Felder sind beide Teil des öffentlichen Profils, so dass Ihre Berechtigungen in Ordnung sein sollte.

Keine Ahnung, ob das funktionieren würde (in der Tat hoffe ich, dass es nicht funktioniert), aber in der Implementierung arbeiten wir in der Produktion, in dem Moment Hash-Zugriffsmethoden anstelle von Methoden verwenden. Also:

new(
    first_name: oauth_data["info"]["first_name"],     
    last_name: oauth_data["info"]["last_name"],  
    ... 

Angesichts Ihrer email etc Felder sind richtig eingestellt zu werden, ich wäre überrascht, wenn das Werk versucht, aber es könnte einen Versuch wert sein.

Fehlt das, haben Sie irgendwelche Validierungen oder before_create Rückrufe, die irgendwie stören könnten?

+0

Nein es ist nicht als gut zu arbeiten. Ich habe Benutzername anstelle von Vorname versucht und es funktioniert gut. Ich hatte Validierungen auf Vorname und Nachname, aber ich entfernte das, um ominiauth Arbeit zu machen. Haben sie sich geändert oder etwas oder ist der Vorname und der Nachname innerhalb der Info? – Abhilash

Verwandte Themen