【问题标题】:Facebook Omniauth hash not returning info_fieldsFacebook Omniauth 哈希未返回 info_fields
【发布时间】:2017-04-26 04:18:28
【问题描述】:

我一直在使用 Facebook Omniauth 和 Devise,但遇到了一个问题,即返回的哈希不包含我在信息字段中请求的任何信息。我只是想让 Facebook 用电子邮件返回名字和姓氏(如果可以单独使用的话),这样我就可以使用该信息创建新用户。我认为我不需要为 Facebook 设置特定权限来返回这些字段(就像您对一些需要验证的 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'

我的回调控制器:

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'

在过去的几天里,这一直让我发疯,我被困住了。任何建议将不胜感激。如果我不小心遗漏了可能相关的内容,请告诉我,我很乐意发布它们。谢谢!

【问题讨论】:

  • 对此有任何更新,我有同样的问题,只是我只是使用omniauth-facebook gem 而没有设计
  • 很遗憾没有。这只是我正在做的一个副项目,并决定专注于项目的其他部分,并且再也没有回过头来解决这个问题。如果您确实找到了解决方案,请告诉我!谢谢!
  • 这不是这个问题的实际解决方案,但作为一种解决方法,我开始为这个应用程序使用 Koala gem,在使用 facebook-omniauth gem 登录后,我可以使用 Koala获取我试图从身份验证哈希中获取的特定信息。这两个资源帮助我弄清楚youtube.com/watch?v=E_XACDrZSiI&t=138sstackoverflow.com/questions/34808971/…

标签: ruby-on-rails ruby devise omniauth omniauth-facebook


【解决方案1】:

我使用omniauth gem 和omniauth-facebook gem。我得到的哈希值相当长。这就是我创建新用户的方式:

  #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 获得的哈希值的格式良好的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多