Ruby on Rails 4 – Autenticação com Facebook e OmniAuth.

Neste artigo, vou ensiná-lo a autenticar seus usuários facilmente usando o Facebook. Isso significa um processo de inscrição muito mais fácil para seus usuários e você não tem mais a responsabilidade de proteger as senhas.

Este artigo foi escrito especificamente para Ruby on Rails 4. Já que tive que remendar soluções de muitas fontes, espero que isso ajude as pessoas a obter uma base de código de trabalho rapidamente.


Objetivos.

Aqui está uma pequena lista das coisas em que vamos trabalhar. Idealmente, você deseja seguir este caminho de progressão para obter um resultado final funcional.

  • Adicione joias Omniauth e Omniauth-Facebook.
  • Crie o Usermodelo.
  • Crie o controlador de sessões.
  • Crie o inicializador Omniauth.
  • Adicione a funcionalidade do lado do cliente usando javascript.
  • Mostrando o usuário conectado na Visualização.

Adicione joias Omniauth e Omniauth-Facebook.

Abra seu Gemfile e adicione as seguintes joias a ele.

gem 'omniauth'
gem
'omniauth-facebook', '1.4.0'

Certifique-se de executar o bundle installcomando. Isso configura seu aplicativo Rails para usar essas joias.


Criar modelo de usuário.

Precisamos gerar um modelo de usuário e adicionar alguns campos necessários que o Omniauth usa para autenticação do usuário.

Execute o seguinte comando no terminal:

rails g model User provider uid name oauth_token oauth_expires_at:datetime

Crie um método no modelo de usuário que interaja com o objeto do Omniauth.

class User < ActiveRecord::Base
def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
user
.provider = auth.provider
user
.uid = auth.uid
user
.name = auth.info.name
user
.oauth_token = auth.credentials.token
user
.oauth_expires_at = Time.at(auth.credentials.expires_at)
user
.save!
end
end
end

Em seguida, precisamos criar um método auxiliar em nosso ApplicationControllerpara acessar quem está logado no momento.

class ApplicationController < ActionController::Base
protect_from_forgery


private
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method
:current_user
end

Criar controlador de sessões

Em seguida, vamos criar um controlador de sessões para lidar com retornos de chamada. É aqui que iremos realmente fazer o login de nossos usuários.

class SessionsController < ApplicationController
def create
user
= User.from_omniauth(env["omniauth.auth"])
session
[:user_id] = user.id
redirect_to root_url

end

def destroy
session
[:user_id] = nil
redirect_to root_url

end
end

Crie também alguns caminhos em seu arquivo. Caso contrário, sua aplicação Rails não saberá qual controlador usar.routes.rb

match 'auth/:provider/callback', to: 'sessions#create', via: [:get, :post]
match
'auth/failure', to: redirect('/'), via: [:get, :post]
match
'signout', to: 'sessions#destroy', as: 'signout', via: [:get, :post]

Crie o inicializador Omniauth

Precisamos criar um inicializador para Omniauth. Crie em .config/initializers/omniauth.rb

OmniAuth.config.logger = Rails.logger

Rails.application.config.middleware.use OmniAuth::Builder do
provider
:facebook, 'YOUR-APP-ID-HERE', 'YOUR-APP-SECRET-HERE'
end

Adicionar funcionalidade do lado do cliente usando Javascript

Crie um arquivo coffescript chamado .facebook.js.coffee

jQuery ->
$
('body').prepend('<div id="fb-root"></div>')

$
.ajax
url
: "#{window.location.protocol}//connect.facebook.net/en_US/all.js"
dataType
: 'script'
cache
: true


window
.fbAsyncInit = ->
FB
.init(appId: 'YOUR-APP-ID', cookie: true)

$
('#sign_in').click (e) ->
e
.preventDefault()
FB
.login (response) ->
window
.location = '/auth/facebook/callback' if response.authResponse

$
('#sign_out').click (e) ->
FB
.getLoginStatus (response) ->
FB
.logout() if response.authResponse
true

Mostrando o usuário conectado na Visualização.

Em seu arquivo, escreveremos algum código para exibir um link de login ou o nome do usuário conectado no momento.application.html.erb

<div id="user-widget">
<% if current_user %>
Welcome
<strong><%= current_user.name %></strong>!
<%= link_to "Sign out", signout_path, id: "sign_out" %>
<% else %>
<%= link_to "Sign in with Facebook", "/auth/facebook", id: "sign_in" %>
<% end %>
</div>

E aí está.

Autenticação rápida e indolor do Facebook em um aplicativo Ruby on Rails 4. Certifique-se de ler a documentação oficial do Facebook sobre como solicitar mais permissões dos usuários se precisar de mais informações pessoais, como e-mails e sexo.