Из этого руководства вы узнаете, как разрешить пользователям вашего приложения входить в систему, используя свою учетную запись Twitter. Сделать это было легко с помощью таких инструментов, как OAuth.
Вы будете использовать OmniAuth-Twitter , который содержит стратегию Twitter для OmniAuth.
Давайте погрузимся в!
Начиная
Начните с создания вашего Rails-приложения. С вашего терминала запустите команду для этого:
1
|
rails new Tuts-Social -T
|
Откройте свой Gemfile и добавьте самоцвет начальной загрузки.
1
2
3
4
|
#Gemfile
…
gem ‘bootstrap-sass’
|
Установите драгоценный камень, выполнив команду:
1
|
bundle install
|
Переименуйте app/assets/stylesheets/application.css
в app/assets/stylesheets/application.scs
.
Когда закончите, добавьте следующие строки кода для импорта начальной загрузки.
1
2
3
4
|
#app/assets/stylesheets/application.scss
…
@import ‘bootstrap-sprockets’;
@import ‘bootstrap’;
|
Создайте _navigation.html.erb
с именем _navigation.html.erb
для хранения вашего кода навигации; частичное должно быть расположено в каталоге app/views/layouts
.
Введите код ниже в IDE. Он использует Bootstrap для создания панели навигации для вашего приложения.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
#app/views/layouts/_navigation.html.erb
<nav class=»navbar navbar-inverse»>
<div class=»container»>
<div class=»navbar-header»>
<%= link_to ‘Tuts Social’, root_path, class: ‘navbar-brand’ %>
</div>
<div id=»navbar»>
<ul class=»nav navbar-nav pull-right»>
<li><%= link_to ‘Home’, root_path %></li>
</ul>
</div>
</div>
</nav>
|
Для использования навигации вам необходимо отобразить ее в макете приложения. Настройте макет приложения, чтобы он выглядел так, как показано ниже.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>Tuts Social</title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag ‘application’, media: ‘all’, ‘data-turbolinks-track’: ‘reload’ %>
<%= javascript_include_tag ‘application’, ‘data-turbolinks-track’: ‘reload’ %>
</head>
<body>
<%= render «layouts/navigation» %>
<div id=»flash»>
<% flash.each do |key, value|
<div class=»flash <%= key %>»><%= value %></div>
<% end %>
</div>
<div class=»container-fluid»>
<%= yield %>
</div>
</body>
</html>
|
Сгенерируйте PagesController
с действием index, введя команду ниже в свой терминал.
1
|
rails generated controller Pages index
|
В созданных индексных представлениях отредактируйте его так, чтобы он выглядел следующим образом.
1
2
3
4
5
6
|
#app/views/pages/index.html.erb
<div class=»jumbotron»>
<h1>Welcome to Tuts Social!</h1>
<p>Thanks for checking us out!</p>
</div>
|
В приведенном выше коде мы используем класс с именем jumbotron
— это компонент Bootstrap, который позволяет расширить область просмотра для демонстрации маркетингового сообщения. Вы можете узнать больше об этом из документации Bootstrap .
Откройте файл маршрутов, чтобы добавить свой root_path
.
1
2
3
4
5
6
7
|
#config/routes.rb
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
root to: «pages#index»
end
|
Настройка OmniAuth-Twitter
Вам нужно создать новое приложение Twitter. Перейдите на эту страницу на страницах Twitter для разработчиков. Введите все необходимые детали, аналогичные тем, что у меня есть на скриншоте ниже.
В качестве URL-адреса обратного вызова введите адрес своего веб-сайта плюс «auth / twitter / callback». Если вы оказались на локальном компьютере, ваш URL обратного вызова должен быть следующим: http://127.0.0.1:3000/auth/twitter/callback
.
Вы будете перенаправлены на информационную страницу приложения в Twitter. Перейдите на вкладку « Ключи и жетоны доступа », чтобы получить ключи. Скопируйте Ключ потребителя и Секрет потребителя и вставьте их в безопасное место — мы скоро ими воспользуемся.
URL обратного вызова — это URL-адрес, на который пользователь будет перенаправлен в приложение после успешной аутентификации и утвержденной авторизации (запрос также будет содержать данные пользователя и токен). Все стратегии OmniAuth предполагают, что URL-адрес обратного вызова равен «/ auth /: provider / callback». :provider
берет название стратегии. В этом случае стратегия будет «твиттерной», как вы укажете в инициализаторе.
Откройте свой Gemfile
чтобы добавить omniauth
-
twiiter
gem.
1
2
3
4
|
#Gemfile
…
gem ‘omniauth-twitter’
|
Теперь создайте инициализатор для OmniAuth в вашем каталоге config / initializers. Это будет держать конфигурацию для OmniAuth. Сделай так, как у меня ниже.
1
2
3
4
5
|
#config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
provider :twitter, ENV[‘TWITTER_KEY’], ENV[‘TWITTER_SECRET’]
end
|
На этом этапе вам нужно будет использовать ключи и получить доступ к сохраненным токенам. Вы должны хранить их в безопасности, так как вы не хотите помещать их в общедоступный репозиторий при фиксации своего кода.
Вы будете использовать драгоценный камень для этого. Снова откройте свой Gemfile и добавьте камень ниже. Добавьте его в свой Gemfile примерно так:
1
2
3
4
5
6
7
|
#Gemfile
…
group :development, :test do
…
gem ‘dotenv-rails’
…
|
Чтобы установить драгоценный камень, запустите.
1
|
bundle install
|
В домашнем каталоге вашего приложения создайте файл с именем .env
.
Откройте его и добавьте свои ключи и токены следующим образом:
1
2
3
4
|
#.env
TWITTER_KEY=xxxxxxxxxxxxxx
TWITTER_SECRET=xxxxxxxxxxxxxx
|
Откройте .gitignore
и добавьте файл, который вы только что создали.
1
2
3
4
5
|
#.gitignore
…
# Ignore .env used for storing keys and access tokens
.env
|
После этого ваши ключи и токены будут в безопасности! Чтобы узнать больше о том, как использовать dotenv
-rails
, обратитесь к странице GitHub .
Время работать на вашем маршруте. Откройте файл маршрутов и добавьте маршрут ниже.
1
2
3
4
|
#config/routes.rb
…
get ‘/auth/:provider/callback’, to: ‘sessions#create’
|
Вам нужно добавить ссылку для входа в Twitter в вашу навигацию. Откройте файл навигации и настройте его так, чтобы он выглядел следующим образом.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<nav class=»navbar navbar-default»>
<div class=»container-fluid»>
<!— Brand and toggle get grouped for better mobile display —>
<div class=»navbar-header»>
<button type=»button» class=»navbar-toggle collapsed» data-toggle=»collapse» data-target=»#navbar-collapse» aria-expanded=»false»>
<span class=»sr-only»>Toggle navigation
<span class=»icon-bar»>
<span class=»icon-bar»>
<span class=»icon-bar»>
</button>
<a class=»navbar-brand» href=»#»>Tuts Social</a>
</div>
<div class=»collapse navbar-collapse» id=»navbar-collapse»>
<ul class=»nav navbar-nav navbar-right»>
<li><%= link_to ‘Home’, root_path %></li>
<% if current_user %>
<li>Signed in as <%= current_user.name %></li>
<% else %>
<li><%= link_to «Sign in with Twitter», «/auth/twitter» %></li>
<% end %>
</ul>
</div>
</div>
</nav>
|
Исходя из вышесказанного, вы хотите показать ссылку для входа в Twitter только тогда, когда пользователь не вошел в систему.
Создание сессий
Вам понадобится контроллер сеанса для обработки входа пользователей. Создайте файл для этого в вашем каталоге контроллеров; Вот как это должно выглядеть.
Действие создания помогает создать сеанс для пользователей, чтобы они могли войти в ваше приложение. Без этого пользователи не смогут войти в систему.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
#app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
def create
@user = User.find_or_create_from_auth_hash(auth_hash)
session[:user_id] = @user.id
redirect_to root_path
end
protected
def auth_hash
request.env[‘omniauth.auth’]
end
end
|
Вам понадобится метод current_user
на этом этапе. Это поможет вам проверить, вошел ли пользователь в систему или нет.
Откройте app/controllers/application_controller.rb
и добавьте следующее.
1
2
3
4
5
6
7
8
|
#app/controllers/application_controller.rb
…
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user
…
|
Модель пользователя
Теперь создайте модель для ваших пользователей. Запустите команду, чтобы сделать это.
1
|
rails generated modoel User provider:string uid:string name:string token:string secret:string profile_image:string
|
Это должно создать файл миграции, который выглядит следующим образом.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
#xxxxxx_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :provider
t.string :uid
t.string :name
t.string :token
t.string :secret
t.string :profile_image
t.timestamps
end
end
end
|
Теперь перенесите вашу базу данных, запустив:
1
|
rake db:migrate
|
Откройте свою модель User и сделайте так, чтобы она выглядела так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
#app/models/user.rb
class User < ApplicationRecord
def self.find_or_create_from_auth_hash(auth_hash)
user = where(provider: auth_hash.provider, uid: auth_hash.uid).first_or_create
user.update(
name: auth_hash.info.nickname,
profile_image: auth_hash.info.image,
token: auth_hash.credentials.token,
secret: auth_hash.credentials.secret
)
user
end
end
|
Код выше хранит некоторую информацию, принадлежащую пользователю. Это включает в себя имя, profile_image, токен и секрет пользователя. Если ваше приложение требует больше, чем это, вы можете проверить страницу OmniAuth-Twitter .
Удаление сессий
В вашем приложении вы хотите предоставить пользователям возможность выхода из системы. Для этого вам понадобится действие destroy
в вашем SessionsController
. Тогда ссылка будет добавлена в вашу навигацию.
Добавьте действие destroy
в свой SessionsController
.
01
02
03
04
05
06
07
08
09
10
11
|
#app/controllers/sessions_controller.rb
…
def destroy
if current_user
session.delete(:user_id)
flash[:success] = «Sucessfully logged out!»
end
redirect_to root_path
end
…
|
Затем добавьте эту ссылку для выхода из вашей навигации, чтобы ваша навигация выглядела следующим образом.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#app/views/layouts/_navigation.html.erb
<nav class=»navbar navbar-default»>
<div class=»container-fluid»>
<!— Brand and toggle get grouped for better mobile display —>
<div class=»navbar-header»>
<button type=»button» class=»navbar-toggle collapsed» data-toggle=»collapse» data-target=»#navbar-collapse» aria-expanded=»false»>
<span class=»sr-only»>Toggle navigation
<span class=»icon-bar»>
<span class=»icon-bar»>
<span class=»icon-bar»>
</button>
<a class=»navbar-brand» href=»#»>Tuts Social</a>
</div>
<div class=»collapse navbar-collapse» id=»navbar-collapse»>
<ul class=»nav navbar-nav navbar-right»>
<li><%= link_to ‘Home’, root_path %></li>
<% if current_user %>
<li>Signed in as <%= current_user.name %></li>
<li><%= link_to ‘Log Out’, logout_path, method: :delete %></li>
<% else %>
<li><%= link_to «Sign in with Twitter», «/auth/twitter» %></li>
<% end %>
</ul>
</div>
</div>
</nav>
|
Откройте ваш config / rout.Rb, чтобы обновить ваши маршруты с действием, которое вы только что создали.
1
2
3
4
5
|
#config/routes.rb
…
delete ‘/logout’, to: ‘sessions#destroy’
…
|
Запустите сервер rails и укажите в браузере http: // localhost: 3000, чтобы увидеть, что у вас есть.
Вывод
Из этого руководства вы узнали, как включить OmniAuth-Twitter в своем приложении Rails. Вы видели, как получать данные пользователей с помощью OmniAuth-Twitter, что вы делали в своей модели User. Вы смогли создать SessionControllers
для обработки входа и выхода пользователей из вашего приложения.
Надеюсь, вам понравилось. В будущем вы увидите, как сделать то же самое для Facebook, Google и LinkedIn.