Как настроить Devise и OmniAuth для вашего Rails-приложения

Вступление

Большинство приложений Ruby on Rails требуют регистрации пользователей и механизмов аутентификации. Разработка их с нуля требует много времени и усилий - к счастью, есть * Devise *. Используя гем Devise, вы можете за считанные минуты настроить полноценную систему аутентификации пользователей.

Однако вы можете сделать своих пользователей счастливее, предоставив им доступ к вашему приложению без создания новой учетной записи. Они могут просто войти в систему, используя свои существующие учетные записи Facebook, Twitter, Amazon или DigitalOcean. Фактически, вы можете поддерживать аутентификацию у любого популярного поставщика услуг OAuth. Поддержка OAuth обеспечивается самоцветом OmniAuth. В этом уроке мы создадим простое приложение, которое использует Devise и OmniAuth.

Предпосылки

Прежде чем начать, убедитесь, что на вашем хосте установлены последние версии RVM, Ruby и Rails. Если вы этого не сделаете, пожалуйста, следуйте инструкциям здесь: https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-on-ubuntu-12-04-lts-precise- pangolin-with-rvm [Как установить Ruby on Rails в Ubuntu 12.04 LTS с RVM]

Этот учебник был протестирован с Ruby 2.1.2 и Rails 4.1.5.

Шаг 1 - Создайте новое приложение Rails

Рекомендуется, чтобы у вас были все приложения Rails в отдельном каталоге.

Вы должны создать его сейчас.

mkdir rails_apps
cd rails_apps

Вы должны инициализировать среду RVM перед тем, как начинать вводить команды Rails.

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

. ~/.rvm/scripts/rvm
rvm use ruby --default

Давайте назовем новое приложение * myapp *. После создания приложения используйте для входа в базовый каталог приложения.

rails new myapp
cd myapp
  • Примечание: все команды Rails должны запускаться из директории вашего приложения, которая в этом случае ~ / rails_apps / myapp. *

Шаг 2 - Добавьте необходимые драгоценные камни в Gemfile

Нам понадобятся драгоценные камни Devise и OmniAuth. Кроме того, вам также понадобится отдельный гем для каждого поставщика услуг OAuth, которого вы хотите поддерживать. Для этого урока мы будем поддерживать вход в систему с помощью DigitalOcean, поэтому нам нужен гем.

Добавьте следующие строки в конец файла + ~ / rails_apps / myapp / Gemfile +. Вы можете использовать в качестве вашего текстового редактора.

gem 'therubyracer'
gem 'devise'
gem 'omniauth'
gem 'omniauth-digitalocean'

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

  • Твиттер - omniauth-twitter

  • Амазонка - омниаут-амазонка

  • Google - omniauth-google

  • Github - omniauth-github

Установите недавно добавленные драгоценные камни.

bundle install

Шаг 3 - Добавить базовую функциональность в приложение

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

Для этого мы можем использовать функцию лесов Rails. Используя команду, мы просто указываем детали о модели, а Rails генерирует полнофункциональные страницы для выполнения операций CRUD (Create Read Update Delete) с этой моделью. Другими словами, все связанные контроллеры и представления генерируются вместе с файлом модели.

rails g scaffold Product name:string price:integer description:text
rake db:migrate

Далее мы должны определить корень этого приложения.

Отредактируйте + ~ / rails_apps / myapp / config / rout.rb + и добавьте строку + root 'products # index' +, чтобы указать корень приложения, чуть ниже существующей строки. Вы можете игнорировать все закомментированные строки. Когда вы закончите, активные строки в файле будут выглядеть так:

Rails.application.routes.draw do
 resources :products

end

Идите, протестируйте ваше приложение сейчас. Запустите сервер разработки, введя:

rails s

Посетите localhost из вашего браузера. Если вы разрабатываете удаленно, замените * localhost * на соответствующий IP-адрес или домен для вашей Droplet. * 3000 * - номер порта по умолчанию для сервера разработки.

На данный момент, вход в систему не требуется. Добавьте пару продуктов, нажав «Новый продукт». Как только вы убедитесь, что ваше приложение работает должным образом, вернитесь к терминалу и нажмите Ctrl + C, чтобы остановить сервер.

Шаг 4 - Настройка устройства

Введите следующие команды, чтобы добавить поддержку аутентификации Devise.

rails generate devise:install
rails generate devise User
rake db:migrate

Это добавляет формы входа и регистрации, а также всю связанную логику.

Наше приложение теперь имеет базовую систему аутентификации, где пользователи могут зарегистрироваться, а затем войти в систему. Тем не менее, все страницы по-прежнему доступны напрямую. Чтобы изменить это, отредактируйте + ~ / rails_apps / myapp / app / controllers / application_controller.rb + и добавьте в качестве действия, которое необходимо выполнить перед обслуживанием любой страницы.

class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception

end

Если вы хотите, вы можете снова запустить сервер разработки с помощью команды и проверить эти недавно добавленные страницы, посетив + http: //: 3000 / + (опять же, используйте свой собственный домен или IP-адрес). Вы должны увидеть страницу, которая выглядит следующим образом:

изображение: https: //assets.digitalocean.com/articles/Configure_Devise/1.jpg [Страница входа]

Вы можете зарегистрироваться как новый пользователь, посетив + http: // localhost: 3000 / users / sign_up +.

Шаг 5 - Обновите модель пользователя для поддержки OmniAuth

Если вы снова запустили сервер, остановите его с помощью CTRL-C. Добавьте новый столбец, вызываемый в модель, созданную Devise.

rails g migration AddColumnsToUsers provider uid
rake db:migrate

Шаг 6 - Получить идентификатор клиента и секрет клиента от поставщика услуг OAuth

Посетите веб-сайт поставщика услуг и зарегистрируйте там свою заявку. Все поставщики услуг имеют различные процедуры регистрации. Для DigitalOcean, обратитесь к учебнику здесь: How To Use OAuth-аутентификация с DigitalOcean как пользователь или разработчик

Вам будет предложено для URL обратного вызова во время процесса регистрации. Для каждого провайдера существует отдельный URL-адрес обратного вызова. Вот URL-адреса обратного вызова для нескольких популярных поставщиков услуг:

  • Цифровой океан: http: //: 3000 / users / auth / digitalocean / callback

  • Facebook: http: //: 3000 / users / auth / facebook / callback

  • Amazon: http: //: 3000 / users / auth / amazon / callback

  • Twitter: http: //: 3000 / users / auth / twitter / callback

  • Google: http: //: 3000 / users / auth / google / callback

Пожалуйста, замените * localhost * IP-адресом или доменом, который разрешается в вашей Droplet. В конце процесса регистрации вам будет предоставлен ваш идентификатор клиента и секрет клиента. Вы будете использовать эти значения на следующем шаге.

Шаг 7 - Обновите инициализатор Devise

Отредактируйте + ~ / rails_apps / myapp / config / initializers / devise.rb +, чтобы добавить идентификаторы и секреты клиента в нижней части файла, непосредственно перед строкой + end +. Также неплохо обновить что-то, что имеет имя и имя вашего собственного сервера. Вам не нужно вносить какие-либо другие изменения, кроме этих двух пунктов.

После редактирования ваш файл будет выглядеть следующим образом (в файле также будет много закомментированных строк):

Devise.setup do |config|
 #Replace example.com with your own domain name
 config.mailer_sender =

 require 'devise/orm/active_record'
 config.case_insensitive_keys = [ :email ]
 config.strip_whitespace_keys = [ :email ]
 config.skip_session_storage = [:http_auth]
 config.stretches = Rails.env.test? ? 1 : 10
 config.reconfirmable = true
 config.expire_all_remember_me_on_sign_out = true
 config.password_length = 8..128
 config.reset_password_within = 6.hours
 config.sign_out_via = :delete

 #Add your ID and secret here
 #ID first, secret second

end

Шаг 8 - Обновите модель пользователя

Модель пользователя, созданную Devise, должна быть изменена, чтобы указать поставщиков услуг, которые мы хотим использовать. Мы добавляем три элемента в существующий список (*: omniauthable,: omniauth_providers ⇒ [: digitalocean] * и не забывайте лишнюю запятую!). Мы также создаем новый метод с именем для извлечения информации, которая доступна после аутентификации.

После его редактирования ваш + ~ / rails_apps / myapp / app / models / user.rb + должен выглядеть так:

class User < ActiveRecord::Base
 devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable,
    :omniauthable, :omniauth_providers => [:digitalocean]

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

Сохраните файл.

Шаг 9 - Добавьте контроллер для обработки URL-адресов обратного вызова

Сначала отредактируйте + ~ / rails_apps / myapp / config / rout.rb + и обновите строку, указав имя контроллера, который будет обрабатывать обратные вызовы. Давайте просто назовем это «обратными вызовами». Ваш файл должен выглядеть следующим образом (за исключением закомментированных разделов):

Rails.application.routes.draw do
 devise_for :users
 resources :products
 root 'products#index'
end

Затем создайте новый файл + ~ / rails_apps / myapp / app / controllers / callbacks_controller.rb +.

Добавьте следующий код к нему:

class CallbacksController < Devise::OmniauthCallbacksController
   def digitalocean
       @user = User.from_omniauth(request.env["omniauth.auth"])
       sign_in_and_redirect @user
   end
end

Если вы использовали больше поставщиков OAuth, вам потребуется отдельный метод для каждого из них. Имя метода должно соответствовать имени провайдера. Например, чтобы добавить поддержку Facebook, ваш метод будет определен с помощью.

Ваша заявка готова. Запустите ваш сервер снова:

rails s

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

изображение: https: //assets.digitalocean.com/articles/Configure_Devise/2.jpg [Войти в систему с помощью DigitalOcean]

Заключение

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

Если вы когда-нибудь решите взять это приложение для производства на Droplet, вы можете обратиться к учебнику здесь: https://www.digitalocean.com/community/tutorials/how-to-launch-your-ruby-on-rails- app-with-the-digitalocean-one-click-image [Как запустить приложение Ruby on Rails с изображением DigitalOcean One Click Image]. Если вы добавляете свое приложение в новую Droplet, не забудьте вернуться к шагу 6, чтобы обновить настройки API DigitalOcean с URL-адресами обратного вызова вашего производственного сервера.

Related