Четверг, 11 ноября 2021 15:09

Implementing Facebook-OmniAuth with Devise & ActiveAdmin for Rails 6 App

Оцените материал
(9 голосов)

Гугля страницы интернета (или же серфя просторы Google, как пожелаете) в поисках примеров реализаций Facebook OAuth2 Strategy, позволивших бы вашему web-приложению авторизовать пользователя посредством Facebook API - в первую очередь поражаешься обилию проблем, возникающих у начинающих разработчиков в попытках такого рода решений.

 

Implementing Facebook-OmniAuth with Devise & ActiveAdmin for Rails 6 app. Facebook OAuth2 Strategy for OmniAuth.
Implementing Facebook-OmniAuth with Devise & ActiveAdmin for Rails 6 app. Facebook OAuth2 Strategy for OmniAuth.

 

Can't load URL: The domain of this URL isn't included in the app's domains. To be able to load this URL, add all domains and sub-domains of your app to the App Domains field in your app settings.

 

Примеры сообщений об ошибках я публикую (в силу SEO соображений) на этой страничке, отметив их устрашающим красным бэкграундом.

 

Невозможно загрузить URL: домен этого URL не включен в домены приложения. Чтобы иметь возможность загрузить этот URL, добавьте все домены и субдомены вашего приложения в поле «Домены приложения» в настройках приложения.

 

Dev banner 2

 

Причем траблы, как мне показалось, вызваны, в основном, некорректной настройкой именно серверного, Facebook App, приложения, а не ошибками на стороне клиента; здесь все более-менее стандартно и хорошо документировано. For example, вы можете развернуть на Heroku такого рода свой собственный application (это rails-app), живую демку; любой заинтересовавшийся может авторизовать Facebook App в своем фейсбучном аккаунте, воочию увидев, как такое работает (вся процедура займет у вас несколько секунд).

 

URL blocked: This redirect failed because the redirect URI is not whitelisted in the app's client OAuth settings. Make sure that the client and web OAuth logins are on and add all your app domains as valid OAuth redirect URIs.

 

Естественно, данный туториал сердобольный автор предназначает, в первую очередь, вконец отчаявшимся авторам интернет-вопросов, вызванных не самой лучшей, в силу моей субъективной оценки, организацией веб-интерфейса соответствующего раздела FACEBOOK for Developers. Посему сходу заходим в этот самый злополучный раздел, и понеслось (все здесь значительно проще, чем кажется на первый взгляд):

 

URL заблокирован: Не удалось выполнить переадресацию, поскольку конечный URI не внесен в «белый» список в разделе приложения «Клиентские настройки OAuth». Убедитесь в том, что вход с помощью OAuth включен для клиента и веб-форм, а также добавьте все домены вашего приложения в качестве действительных URI для переадресации OAuth.

 

"Создать приложение" -> "Выберите тип приложения" -> "Потребительское" -> Далее -> "Отображаемое название" => Любое, какое хотите -> "Создание приложения" (понадобится ввести пароль). Далее Facebook перенаправит вас на страничку "Добавление продуктов в приложение", выбираем "Вход через Facebook" -> "Настроить" -> "Веб" -> "Укажите URL своего сайта" -> "URL сайта" => такой-то -> "Save".

Теперь открываем в левом сайдбаре "Настройки" -> "Основное", "Домены приложений" => домен вашего клиентского приложения, URL этого же домена без затей вписываем в "URL-адрес политики конфиденциальности", "Удаление данных пользователей", "URL-адрес Пользовательского соглашения". Жмем "Сохранить изменения", предварительно не забыв скопировать со странички "ID приложения" и "Секрет приложения" (вкупе с url_callback их понадобится указать в переменных окружения панели администрирования хостинга Heroku, например).

И последнее здесь. Снова в левом сайдбаре "Вход через Facebook" -> "Настройки", "Действительные URI перенаправления для OAuth" - пишем этот callback:

 

https://<YOUR_SUBDOMAIN>.herokuapp.com/users/auth/facebook/callback

 

Все, сохраняем и закрываем глючный раздел FACEBOOK for Developers, чтобы, по возможности, больше сюда не возвращаться (впечатление, будто бы в крайней спешке или вообще спецом нахерачено, в целях обломать как можно больше сдуру забредшего сюда народу; информационные сообщения то и дело предоставляют неверную информацию, русскоязычные доки почти ни о чем).

 

Увидеть на гитхабе.

 

Теперь (очень кратко), что касается программного кода клиентского приложения. Целиком и полностью rails-app доступен в гитхабе, ReadMe описывает последовательность действий, позволяющих быстро и без проблем развернуть приложение на Heroku. Остановлюсь здесь лишь на двух моментах: контроллер -

omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    @user = User.from_omniauth(request.env['omniauth.auth'])

    if @user.persisted?
      sign_in_and_redirect @user, event: :authentication
      set_flash_message(:notice, :success, kind: 'Facebook') if is_navigational_format?
    else
      session['devise.facebook_data'] = request.env['omniauth.auth']
      redirect_to new_user_registration_url
    end
  end

  def failure
    redirect_to root_path
  end
end

 

и модель:

user.rb

class User < ApplicationRecord
  devise :database_authenticatable, 
  :rememberable, :omniauthable, omniauth_providers: [:facebook]

  def self.new_with_session(params, session)
    super.tap do |user|
      if data = session['devise.facebook_data'] && session['devise.facebook_data']['extra']['raw_info'] && user.email.blank?
        user.email = data['email']
      end
    end
  end

  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.email = auth.info.email
      user.password = Devise.friendly_token[0, 20]
      user.name = auth.info.name
      user.image = auth.info.image
    end
  end
end

 

Продолжение темы на форуме. И, пожалуй, это все. Марку привет, как увидитесь.

Последнее изменениеПонедельник, 29 января 2024 17:40

Оставить комментарий

Добавьте ваш комментарий

Разработка web-проектов

Web Development Masterpro

Read more