Как получить адрес электронной почты пользователя Facebook от omniauth для Rails 4?

Как я могу получить электронную почту пользователя Facebook с помощью omniauth для Rails? Это мой omniauth.rb

OmniAuth.config.logger = Rails.logger

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

это моя модель

def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |user|
      puts "auth.providerauth.providerauth.providerauth.provider"
      puts auth.info.inspect

      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.oauth_token = auth.credentials.token
      user.oauth_expires_at = Time.at(auth.credentials.expires_at)
      user.username = auth.info.name.gsub(" ","") + new_token
      user.email = auth.info.email
      user.password = digest(new_token)
      user.save!
    end
  end

Но я понял это только из информации

auth.providerauth.providerauth.providerauth.provider
#<OmniAuth::AuthHash::InfoHash image="http://graph.facebook.com/xxxx" name="xxx xxxx">

Похоже, никакого электронного письма в ответ. Но мне нужно электронное письмо, чтобы пройти проверку моей модели, так что мне делать?

Спасибо!


person Varis Darasirikul    schedule 24.02.2016    source источник


Ответы (2)


по идее user.auth.info.email должно быть так

https://github.com/mkdynamic/omniauth-facebook

... но на самом деле Facebook не нужно возвращать электронную почту, если пользователь не хочет публиковать электронную почту. (например, Twitter никогда не ответит вам по электронной почте)

поэтому подход, при котором вы создаете пользователя непосредственно из того, что возвращает обратный вызов Oauth, может быть неправильным для вас.

если вам действительно нужно электронное письмо от пользователя, попробуйте сохранить все, что OAuth возвращает в модель Identity, а затем, если электронное письмо присутствует, создайте пользователя, а если электронное письмо отсутствует, попросите пользователя предоставить электронное письмо в «форме завершения регистрации», которая будет создать пользователя.

Подумайте об этом: с технической точки зрения Oauth — это протокол, в котором пользователь может зарегистрироваться в вашем приложении без предоставления каких-либо учетных данных => Provide-UID is what defines him, а не электронная почта.

Таким образом, вы либо разделяете способ обработки сеанса на User(email&password) or Identity(OAuth), что-то вроде current_user || current_identity в ваших контроллерах .... или вы связываете их, когда предоставляется электронная почта.

person equivalent8    schedule 24.02.2016
comment
stackoverflow .com/questions/7247145/ - person equivalent8; 24.02.2016
comment
Еще один способ думать об этом таков: все, что Facebook возвращает в auth (информационном материале), больше похоже на полезную информацию, а не на обязательный контракт. Единственным договором между вами и Facebook является auth.uid . Если завтра facebook решит изменить свой API и больше не предоставлять имя, ваше приложение не должно быть затронуто этим. Постройте логику аутентификации, опираясь не на элементы в info, а на комбинацию provider-uid - person equivalent8; 24.02.2016

Он присутствует в авт.

auth.info.email
person Chakreshwar Sharma    schedule 24.02.2016
comment
у меня ничего нет внутри auth.info.email - person Varis Darasirikul; 24.02.2016
comment
В этом случае у пользователя может не быть электронной почты, он зарегистрирован по своему номеру телефона. - person Chakreshwar Sharma; 24.02.2016