OmniAuth - логин на Facebook не предоставляет адрес электронной почты в user_info - PullRequest
7 голосов
/ 19 февраля 2011

Я использую OmniAuth, и после входа в систему через Facebook я получаю ключ omniauth.auth, который выглядит следующим образом:

user_info: 
  name: Tim Sullivan
  urls: 
    Facebook: http://www.facebook.com/...
    Website: 
  nickname: ...
  last_name: Sullivan
  first_name: Tim
uid: "123456789"
credentials: 
  token: [some token]
extra: 
  user_hash: 
    name: Tim Sullivan
    timezone: -5
    gender: male
    id: "123456789"
    last_name: Sullivan
    updated_time: 2010-12-30T00:52:39+0000
    verified: true
    locale: en_US
    link: http://www.facebook.com/...
    email: tim@myemailaddress.com
    first_name: Tim
provider: facebook

Теперь, в соответствии с документами , электронное письмо должно быть в разделе user_info, но это не так. Это, однако, в разделе extra/user_hash. Поскольку я удаляю extra, он не сохраняется, поэтому позже у меня возникнут проблемы. Я мог бы добавить это сам, но это не объясняет, почему его там нет.

Почему электронная почта не помещается в раздел user_info? Жук? Незадокументированное изменение?

Ответы [ 6 ]

3 голосов
/ 02 июля 2012

перемещено в

email = omniauth["extra"]["raw_info"]["email"]
2 голосов
/ 28 июля 2012

Хеш "info" содержит всю информацию Пользователя:

email = omniauth["info"]["email"]
1 голос
/ 02 марта 2011

Я думаю, что документ не обновлен.Я обычно получаю его из дополнительного хеша перед удалением.

email = omniauth["extra"]["user_hash"]["email"]
0 голосов
/ 22 сентября 2015

Поскольку вы используете Rails, а не JavaScript (другой человек ответил, но для JS), вам нужно специально попросить, чтобы электронная почта была возвращена из хеша информационного поля, поскольку это не по умолчанию.Вы устанавливаете это в своем файле 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-Чтение GitHub в фейсбуке.

0 голосов
/ 12 декабря 2014

Мы используем omniauth с FB JSDK, и я не смог вернуть письмо, потому что я упустил тот факт, что FB.login () требует опции 'scope'.

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

После добавления параметров (даже если область была настроена на сервере) все было исправлено.

https://developers.facebook.com/docs/reference/javascript/FB.login/v2.2#permissions

0 голосов
/ 02 января 2014

Хотя omniauth["info"] раньше использовало и должно содержать информацию, я заметил, что Facebook, похоже, дает мне ошибки в сообщении электронной почты, связанном с ошибкой / (функцией?) Facebook.Так что я получаю периодические ошибки с этим хешем, где нет электронного письма, которое ломает все.

После долгих отладок я обнаружил, что самый безопасный способ не сломать мой код - это вызвать FB API с помощью Koala или просто хороший REST и получить информацию, необходимую для входа в систему, если omniauth["info"] не содержит информацию, которую вынеобходимость.

...