0

用户接受使用他的 facebook 帐户登录后,我的应用程序回调将被 facebook 调用,我注意到 facebook 没有检索用户电子邮件,尽管在omniauth 的配置中,我已经在权限列表中列出了电子邮件,例如这个:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, omniauth_app_id, omniauth_app_secret_id,
           :scope => 'email,user_birthday,read_stream', :display => 'popup'
end

我期待在request.env['omniauth.auth']['extra']['raw_info']['email']或中找到电子邮件request.env['omniauth.auth']['info']['raw_info']['email'] 但是,它不存在......事实上,它不在request对象内的任何属性中!

任何想法 ?它与我的应用程序 facebook 设置有关吗?

编辑

以下是 Facebook 的回调结果:

puts auth.inspect

#<OmniAuth::AuthHash credentials=#<Hashie::Mash expires=true expires_at=1353164400 token="***"> extra=#<Hashie::Mash raw_info=#<Hashie::Mash first_name="***" id="***" last_name="***" link="***" locale="ar_AR" name="***" timezone=2 updated_time="2012-11-17T13:01:59+0000" username="***" verified=true>> info=#<OmniAuth::AuthHash::InfoHash first_name="***" image="***" last_name="***" name="***" nickname="***" urls=#<Hashie::Mash Facebook="***"> verified=true> provider="facebook" uid="***">

我已经用*替换了真实数据,但是,您可以看到电子邮件数据丢失了..

编辑2

这是我在 Gemfile gem 'devise' 中使用的宝石

gem 'omniauth'
gem 'omniauth-facebook', '1.4.0'

gem 'oauth2'
4

4 回答 4

4

好的,我找到了!这是facebook在这里说的

默认情况下,调用 FB.login 将尝试仅使用基本权限对用户进行身份验证。如果您需要一个或多个附加权限,请使用选项对象调用 FB.login,并使用您希望从用户请求的权限的逗号分隔列表设置范围参数。

所以,我必须像这样添加“电子邮件”:

 FB.login(function(response) {
   // handle the response
 }, {scope: 'email,user_likes'});

非常感谢所有试图提供帮助的人:-)

于 2012-12-03T01:32:43.350 回答
2

可以在不确认电子邮件的情况下拥有 Facebook 帐户。在这种情况下,request.env['omniauth.auth']['info']没有'email'密钥。

于 2014-01-29T13:47:46.600 回答
1

我们为 facebook 使用 devise 和 omniauth - 遵循以下 railscast。我不知道您是否可以适应,但我们已成功提取电子邮件和其他一些信息。从回调。

http://asciicasts.com/episodes/241-simple-omniauth

我们的控制器动作看起来像这样(浓缩):

  def create  
    omniauth = request.env["omniauth.auth"]  
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])  
    if authentication  
      sign_in_and_redirect(:user, authentication.user)  
    elsif current_user  
      current_user.authentications.create(:provider => omniauth ['provider'], :uid => omniauth['uid'])  
      redirect_to authentications_url  
    else
      user = User.new
      user.apply_omniauth(omniauth)
      if user.save
        sign_in_and_redirect(:user, user)
      else   
        session[:omniauth] = omniauth.except('extra')
        redirect_to new_user_registration_url
       end
    end  
  end

用户.apply_omniauth:

   def apply_omniauth(omniauth)  
     authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid']) 
   end

根据其他人的建议,我们使用以下方式收到电子邮件:

 @omniauth_email = session[:omniauth][:info][:email]

我希望这会有所帮助,我知道您正在寻找的东西并不安静。

- 编辑 -

我的初始化程序与您的不同。尝试删除所有 xs 内容并使用以下内容:

 Rails.application.config.middleware.use OmniAuth::Builder do  
  provider :facebook, 'xxxxxx', 'xxxxxx'  
 ...
 end
于 2012-11-17T17:22:03.297 回答
1

info哈希中获取它怎么样?

request.env['omniauth.auth']['info']['email']

我认为这是omniauth-facebook在Auth Hash部分推荐的

于 2012-11-17T05:25:13.203 回答