Ruby on Rails Omniauth facebook不会返回电子邮件

我一直在努力设置我的Omniauth for facebook我不知道我做错了什么。

我无法收到用户的电子邮件。 返回的哈希只包含“name”和“uid”,甚至不包含“first_name”和“last_name”

devise.rb:

config.omniauth :facebook, "KEY", "SECRET" 

omn​​iauth_callbacks_controller.rb:

 class OmniauthCallbacksController < Devise::OmniauthCallbacksController def facebook logger.info request.env["omniauth.auth"] @user = User.from_omniauth(request.env["omniauth.auth"]) sign_in_and_redirect @user end end 

user.rb:

 class User  [:facebook] has_many :authentications def self.from_omniauth(auth) logger.info auth user = where(email: auth.info.email).first if(user != nil) user.authentications.where(provider: auth.provider, uid: auth.uid).first_or_create do |l| user.authentications.create!(user_id: user.id, provider: auth.provider, uid: auth.uid) end else user = User.create!(email: auth.info.email, password: Devise.friendly_token[0,20], first_name: auth.info.first_name, last_name: auth.info.last_name) user.authentications.create!(user_id: user.id, provider: auth.provider, uid: auth.uid) end user end end 

registrations_controller.rb:

 class RegistrationsController < Devise::RegistrationsController private def sign_up_params params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation) end def account_update_params params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :current_password) end end 

routes.rb中:

  devise_for :users, :controllers => { registrations: 'registrations', omniauth_callbacks: 'omniauth_callbacks' } 

返回哈希:

 #<OmniAuth::AuthHash credentials=# extra=#<OmniAuth::AuthHash raw_info=#> info=#  provider="facebook" uid="1506781179612589"> 

确保你没有在信息字段请求中放置空格(另一个答案可能是错误的)。

您需要特别要求从info字段哈希返回电子邮件,因为它不是默认情况下。

如果您在没有Devise的情况下使用Omniauth-Facebook,请在config / initializers / omniauth.rb文件中进行设置,如下所示:

 Rails.application.config.middleware.use OmniAuth::Builder do provider :facebook, Rails.application.secrets.omniauth_provider_key, Rails.application.secrets.omniauth_provider_secret, :scope => 'email', :display => 'popup', :info_fields => 'name,email' end 

这个信息有点隐藏在omniauth-facebook gem的GitHub自述文件的配置部分的最后。

但是,使用Devise plus Omniauth,你可以在config / initializers / devise.rb中设置它(如果字符串中没有空格!):

 config.omniauth :facebook, 'app_id', 'app_secret', scope: 'email', info_fields: 'name,email' 

我只需要在devise.rb中添加这个来检索电子邮件:

  config.omniauth :facebook, "KEY", "SECRET", scope: 'email', info_fields: 'email, name' 

我有同样的问题。 我让它更新了omniauth和omniauth-facebook gems。

您需要请求权限。 例如,要请求emailuser_birthdayread_stream权限并在弹出窗口中显示身份validation页面:

 Rails.application.config.middleware.use OmniAuth::Builder do provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], :scope => 'email,user_birthday,read_stream', :display => 'popup' end 

如果您有任何疑问,请查看Omniauth-facebook 。

我遇到了同样的问题,但事实certificate这是一个不同的问题,如果您使用客户端流程,请确保在您的客户端上请求您需要的范围:

 FB.login(function(response) { // hit API callback endpoint }, {scope: 'email'});