Хэш Facebook Omniauth не возвращает info_fields

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

Я использую 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

Мой пользователь.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'

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


person Michael Radzwilla    schedule 10.12.2016    source источник
comment
какие-либо обновления по этому поводу, у меня та же проблема, только я просто использую гем omniauth-facebook, а не Devise   -  person Phil    schedule 02.01.2017
comment
К сожалению нет. Это был всего лишь побочный проект, над которым я работал, и я решил сосредоточиться на других частях проекта и так и не вернулся к выяснению этого. Если вы найдете решение, пожалуйста, дайте мне знать! Спасибо!   -  person Michael Radzwilla    schedule 03.01.2017
comment
Это не фактическое решение этой проблемы, но в качестве обходного пути я начал использовать гем Koala для этого приложения, и после входа в гем facebook-omniauth я могу использовать Koala для получения конкретных фрагментов информации, которые я пытался получить от хэша авторизации. Эти два ресурса помогли мне понять это youtube.com/watch?v=E_XACDrZSiI&t=138s и stackoverflow.com /вопросы/34808971/   -  person Michael Radzwilla    schedule 08.01.2017


Ответы (1)


Я использую гем 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.

person Alexander Luna    schedule 11.12.2016