Где воздух гор - там тишина снегов, молчание камней и дремлет сила

Программирование Web

Ruby on Rails 5: Devise -подключаем аутентификацию с помощью ОmniAuth для Facebook

2018-07-07 09:14:34







Сейчас часто требуется подключать различные соц.сети в web- проекты, чтобы пользователь мог авторизироваться с помощью существующего профиля в соц.сети.

Для начала поместим поддержку решения в Gem файл приложения:


gem 'omniauth'
gem 'omniauth-facebook'


В нашем приложении используются известный Devise как система аутентификации пользователей.


После обновления Gem файла мы начнем:



1 . Мы поместим подедржку :omniauthable в модель User:


class User < ApplicationRecord

has_one :profile
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable. :confirmable, :omniauthable
end




2. После поместим новый метод def self.from_omniauth(auth) , который проверяет наличие пользователя или создает его если его не существует в данный момент:


class User < ApplicationRecord

has_one :profile
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable :confirmable, :omniauthable


def self.from_omniauth(auth)
user = User.where(email: auth.info.email).first

if user
return user
else
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.fullname = auth.info.name
user.provider = auth.provider
user.uid = auth.uid
user.email = auth.info.email
user.image = auth.info.image
user.password = Devise.friendly_token[0,20]
end
end
end


end


3 . Далее создадим новый контролер “omniauth_callbacks_controller.rb” для аутентификации пользователя через facebook:


class 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

end

4 . Поместим ссылку на метод аутентификации через facebook в файле регистрации Devise:


<h2>Log in</h2>

<%= link_to "Sign In with Facebook", user_omniauth_authorize_path(:facebook), class: "btn btn-primary" %>


<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>

<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>

<% if devise_mapping.rememberable? -%>
<div class="field">
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
</div>
<% end -%>

<div class="actions">
<%= f.submit "Log in" %>
</div>
<% end %>

<%= render "devise/shared/links" %>



<h2>Sign up</h2>

<%= link_to "Sign In with Facebook", user_omniauth_authorize_path(:facebook), class: "btn btn-primary" %>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>

<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>

<div class="field">
<%= f.label :password %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>

<div class="field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off" %>
</div>

<div class="actions">
<%= f.submit "Sign up" %>
</div>
<% end %>

<%= render "devise/shared/links" %>


5 . Затем мы отредактируем файл роутера, поместив туда путь для связи с вновь созданным контроллером:

Rails.application.routes.draw do

root to: "front#index"

devise_for :users

:path => '',
:path_names => {:sign_in => 'login', :sign_out => 'logout', :edit => 'profile'},
:controllers => {:omniauth_callbacks => 'omniauth_callbacks',
:registrations => 'registrations'
}



На этом все.

Здесь нет комментариев


Новый комментарий:
























Яндекс.Метрика