2016-12-10 4 views
1

Я работаю с Facebook Omniauth и Devise, но столкнулся с проблемой, когда возвращаемый хэш не содержит никакой информации, которую я запрашиваю в своих информационных полях. Я просто пытаюсь получить Facebook, чтобы вернуть имя и фамилию по электронной почте, если они доступны отдельно, поэтому я могу создавать новых пользователей с этой информацией. Я не думаю, что мне нужно настроить определенные разрешения с Facebook, чтобы вернуть эти поля (как и с некоторыми информационными полями, требующими проверки).Facebook Omniauth hash не возвращает info_fields

Я использую Rails 4.2.6. Это возвращаемый хэш:

#<OmniAuth::AuthHash credentials=#<OmniAuth::AuthHash 
expires=true expires_at=1486542909 
token="EAAXYor9I0XgBADbIaZC99Lu0xGAdVVSXSyZC1TsZCHcZCi0kiWPdZCHA0DsLait7zn1cSpEsbc1mViWvFxZAPraz2Hdyfyn2pfonpeDlhP6Nqv7RiGNpDQ1Bxxm81LHwoPHMIbag95pksGZChcQ7YMrk8eUuQNkgScZD"> 
extra=#<OmniAuth::AuthHash 
raw_info=#<OmniAuth::AuthHash id="xxxxxxxxxx" name="xxxxxxxx">> 
info=#<OmniAuth::AuthHash::InfoHash 
image="http://graph.facebook.com/xxxxxxxxxx/picture?type=square" 
name="xxxxxxxxxx"> 
provider="facebook" 
uid="xxxxxxxxxx"> 

Большинство решений для подобных вопросов вовлекли что-то в devise.rb, который выглядит, как это для меня:

config.omniauth :facebook, "xxxIDxxx", "xxxSECRETxxx", scope: 'email,public_profile', info_fields: 'email, first_name, last_name' 

Мой CallBacksController:

class CallbacksController < Devise::OmniauthCallbacksController 

def all 
    @user = User.from_omniauth(request.env["omniauth.auth"]) 
    @request = request.env["omniauth.auth"] 

    if @user.persisted? 
     flash.notice = "You have successfully signed in!" 
     sign_in_and_redirect @user 
    else 
     session["devise.user_attributes"] = @user.attributes 
     redirect_to new_user_registration_path  
    end 
end 

alias_method :facebook, :all 
end 

My User.rb:

devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:facebook] 

has_many :posts 

def self.from_omniauth(auth) 
     puts auth 
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.email = auth.info.email || "" 
     user.password = Devise.friendly_token[0,20] 
    end 
end 

И эти родственные камни я использую:

gem 'geocoder' 
gem 'devise' 
gem 'omniauth' 
gem 'omniauth-facebook' 

Это сводит меня с ума в течение последних нескольких дней, и я застрял. Любые предложения будут ценны. Если есть вещи, которые могут быть связаны с тем, что я случайно ушел, сообщите мне, и я был бы рад опубликовать их. Благодаря!

+0

любое обновление по этому вопросу, у меня такая же проблема, только я просто использую omniauth-facebook gem и no Devise – Phil

+0

К сожалению, нет. Это был только побочный проект, над которым я работал, и решил сосредоточиться на других частях проекта и никогда не возвращался к этому. Если вы нашли решение, пожалуйста, дайте мне знать! Благодаря! –

+0

Это не реальное исправление этой проблемы, но в качестве обходного пути я начал использовать жемчужину Koala для этого приложения, и после входа в систему с помощью facebook-omniauth gem я могу использовать Koala для получения конкретных фрагментов информации, которые Я пытался получить хеш-аут. Эти два ресурса помогли мне разобраться в https://www.youtube.com/watch?v=E_XACDrZSiI&t=138s и http://stackoverflow.com/questions/34808971/gem-koala-facebook-api-get-object- запрос –

ответ

0

Я использую драгоценный камень omniauth и драгоценный камень omniauth-facebook. Хэш, который я получаю, довольно длинный. И это, как я создаю новые пользователь:

#Facebook login 
    def self.from_omniauth(auth) 
    where(email: auth.info.email).first_or_initialize.tap do |user| 
     user.name = auth.info.name 
     user.email = auth.info.email 
     user.password = auth.uid 
     user.password_confirmation = auth.uid 
     user.remote_avatar_url = auth.info.image 
     user.uid = auth.uid 
     user.provider = auth.provider 
     user.oauth_token = auth.credentials.token 
     user.oauth_expires_at = Time.at(auth.credentials.expires_at) if auth.provider == "facebook" 
     user.save! 
    end 
    end 

Для отладки это в то время, я поднял ошибку, когда я получил хэш в моем контроллере:

raise request.env["omniauth.auth"].to_yaml 

Это дает вам в терминальном а хорошо отформатированный вывод хэша, который вы получаете от facebook.

Смежные вопросы