Oops... your message was not sent

Your message has been successfully sent

тематические истории, основанные на опыте компании JetRuby
Веб-разработка

Работа с API социальных сетей. Часть1: интеграция с Rails

На одном проекте нам понадобилось парсить данные сразу из четырех социальных сетей, а также собирать их в одном месте. Мы решили поделиться столь ценным опытом и рассказать о главных принципах работы с социальными сетями на примере Facebook, Instagram и Twitter.

Регистрация приложения

Работа с социальными сетями начинается с создания приложения. Демонстрируем на примере Твиттера, но настройка на других платформах производится аналогично. Итак, нам сюда.

Для создания приложения нужно заполнить следующие поля: имя, адрес сайта и callback url. О том, что такое callback url мы расскажем чуть ниже.API-socialmedia

Как видите, в адресах ссылок нельзя использовать localhost — вместо него вводим 127.0.0.1:3000.

Callback url — это адрес, на который будут отправлены данные пользователя после авторизации.

Далее нам нужны ключи приложения.

API-socialmedia-2

Копируем API Key И API Secret. А теперь идем настраивать Rails.

Типы авторизации в API

Для того чтобы выполнить запрос в социальной сети, нужна авторизация. И тут у нас два пути:

  1. Авторизация от приложения
  2. Авторизация от пользователя

То есть тип авторизации определяет реквестера запросов. Давайте разбираться. Для авторизации от приложения вам достаточно пары API Key и API Secret, полученной при регистрации. В этом случае у вас будет доступ ко всем публичным данным пользователей. Но лимит запросов окажется ограниченным.

Авторизация от пользователя позволит получить доступ ко всем данным, на которые он дал разрешение. После авторизации у вас будет еще пара токенов Key и Secret. Их нужно сохранить для последующего использования.

Примечание: Некоторые соцсети, например, Facebook возвращают лишь одно значение.

Зачем нужен Callback URL в настройках приложения

В случае успешной авторизации социальная сеть должна отправить нам данные пользователя. Для этого ей нужен какой-то адрес. На самом деле, его отправляет наше приложение на этапе авторизации. В настройках мы указываем адрес для безопасности, а социальная сеть проверяет совпадение и выдает ошибку в случае несоответствия.

Примечание: Возможность использовать localhost  присутствует не всегда. Но вы можете юзать локальный IP адрес. Мы поступили именно так.

Omniauth and Devise — авторизация пользователей через социальные сети

На стороне Rails все достаточно просто, если знать о паре подводных камней. Но до них мы еще дойдем, а пока давайте по порядку

Гемы

gem ‘omniauth’

gem ‘omniauth-facebook’

gem ‘omniauth-twitter’

gem ‘omniauth-linkedin’

gem ‘omniauth-instagram’

gem ‘devise’

Ключи и инициализация

Все ключи хорошо бы хранить в одном месте. В Rails для этого задумывался файл config/secrets.yml, но он не поддерживает вложенность из коробки. Поэтому придется работать по старинке.

Создаем файл config/omniauth_keys.yml. Не забываем добавить его в .gitignor!

Примечание: перед вами не реальные ключи и работать они не будут. Просто хотелось для наглядности оставить ключи, похожие на оригинал. Дело в том, что у каждой социальной сети они обзываются по-своему. Мы же привели названия к одному формату.

Создаем initializer config/initializers/omniauth.rb

Как видите, для Фейсбука был использован параметр scope. Это список данных и действий, к которым приложение получит доступ после авторизации.

Добавляем роуты для callback_url — config/routes.rb

Теперь мы готовы реализовать логику регистрации и авторизации.

Регистрация и Авторизация

Общий план.

  1. Принять данные от социальной сети
  2. Привести их к единому формату
  3. Сохранить в базу, создать нового пользователя
  4. Авторизовать нового пользователя

Для хранения социальных профилей будем использовать таблицу social_profiles(int: user_id, string: access_token, string: secret_key, bool: valid_tokens).

То есть мы сохраняем токен и прикрепляем его к пользователю. Если же юзер хочет поменять свой пароль от социальной сети, его токен становится невалидным. В таком случае мы помечаем его профиль и просим переподключить социальный аккаунт.

Примечание: этот пункт не нужен, если социальная сеть используется только для авторизации.

Мы должны определить в контроллере по экшену на каждую используемую социальную сеть. Но для обработки этих данных достаточно легко использовать метапрограммирование и написать один универсальный обработчик. Давайте его разберем немного подробнее.

Сохраняем данные авторизации в переменную для более удобного использования.

Логинимся с полученными данными (предварительно их нормализуем). Если пользователь пришел к нам впервые — мы его регистрируем.

После регистрации пользователя, мы сохраняем данные, полученные из социальной сети в его профиль, а также создаем (обновляем) его социальный профиль

Оставшаяся часть контроллера не так интересна (банальное приведение данных к единому формату). Давайте лучше рассмотрим подводные камни такой логики при использовании гема “devise”.

Проблема заключается в том, что по умолчанию “devise” накладывает индекс уникальности на поле email при создании таблицы пользователей. Социальные сети обычно не присылают электронный адрес пользователя. Поэтому у нас, во-первых — не проходит валидация email, во-вторых — даже если мы ее уберем, база позволит сохранить пустое значение всего один раз. Второй раз оно уже не будет уникальным.

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

И пишем модуль для регистрации через социальные сети:

Код логики регистрации и авторизации говорит сам за себя. Нам же интересны те два метода, которые необходимо переопределить.


То есть мы проверяем, есть ли у нас социальные профили и в зависимости от этого смотрим нужно ли нам валидировать email.

Вот и все. Никакой магии. Следуя приведенным инструкциям, вы также сможете начать извлечение и обработку данных из API социальных сетей. Во второй части мы расскажем, как организовать код для работы с социальными сетями. Не переключайтесь!

department
Статью подготовил
Отдел веб-разработки
Профессиональная разработка сайтов и приложений на стороне сервера и клиента. Проектирование дизайна, верстка страниц и техническое обслуживание реализованных проектов.
New Articles