Ruby on Rails omniauth и Carrwave

Я использую omniauth (omniauth-facebook) в своем приложении ruby ​​on rails. Я хотел бы знать, могу ли я получить информацию о городе, стране и поле пользователя. И как я могу сделать фотографию профиля пользователя с помощью несущей волны,

Спасибо.


person Hilmi Yamcı    schedule 07.07.2017    source источник


Ответы (2)


Используя (документацию Carrierwave)[https://github.com/carrierwaveuploader/carrierwave] в качестве ссылка, вам нужно будет изменить свою пользовательскую модель, чтобы добавить новые поля для поддержки функциональности драгоценного камня несущей волны.

Обычно это означает:

class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
end

Но это будет отличаться, если вы используете MongoDB вместо SQL/ActiveRecord.

Вы можете проверить существование этого нового поля, инициализировав новый объект в консоли rails и просмотрев доступные поля.

bundle exec rails c 

u = User.new
u.(tab twice quickly to see the available options)
# You are looking for the avatar field
u.avatar

Вы можете установить его с консоли, чтобы протестировать его, используя

File.open('somewhere') do |f|
  u.avatar = f
end

Затем, наконец, вы добавите его в поле формы в своих представлениях после того, как протестируете его. Обычно у вас есть CRUD для вашего пользователя, поэтому в формах создания/обновления в представлениях вы изменяете эти формы, чтобы включить форму файла (это HTML, а не рельсы, поэтому вы можете искать дополнительную информацию, используя HTML в своем поиске), и как только он будет добавлен, вам нужно будет изменить соответствующие контроллеры, чтобы внести значение в белый список, чтобы его можно было сохранить с помощью этих действий контроллера.

Этот процесс аналогичен добавлению других полей в ваш пользовательский объект после первоначального создания пользовательской модели.

person broken_historian    schedule 07.07.2017

Обычно omniauth возвращает стандартный ответ, касающийся только аутентификации, в основном хэш с комбинацией email, name/first/last, profile_picture url, username и т. д. Некоторые провайдеры предоставляют вам электронную почту, другие нет, третьи предоставляют только некоторые поля, если вы спросите специально для них через прицелы.

Для facebook я использую следующее в своем omniauth.rb (внутри config/initializers/*)

provider :facebook, ENV['FB_ID'], ENV['FB_SECRET'], scope: 'public_profile, email, manage_pages, user_friends', info_fields: 'id, first_name, last_name, link, email', image_size: 'large'

Это означает, что facebook предоставит мне электронное письмо, некоторую базовую информацию, такую ​​как идентификатор, имя и фамилию, в хэше ответа (об организации которого позаботится omniauth) после успешной авторизации oauth. Токен, который он предоставит, также будет предназначен для управления страницами, хотя изначально я не прошу каких-либо полей, связанных с ним.

Таким образом, в вашем случае вы должны запросить city, country и что-то еще в info_fields (двойная проверка через их обозреватель графиков, что вам не нужна дополнительная область для этих полей).

После того, как вы получите ответ через omniauth (который в основном представляет собой фрагмент кода, написанный как промежуточное программное обеспечение, которое выполняет поток oauth2 для вас — вы также можете сделать это самостоятельно), у вас будет URL-адрес изображения профиля. Вы захотите скачать эту картинку. Используя Carrwave, вы делаете это либо на своем контроллере, либо в модуле/классе, создавая экземпляр столбца, в котором у вас установлен загрузчик, а затем выполняя метод .download! передавая ему URL-адрес, откуда скачать:

user.avatar = AvatarUploader.new
user.avatar.download! omniauth_hash['blabla_fields']['blabla_picture_url']

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

person m3characters    schedule 07.07.2017