Login Devise Com Facebook

Acabaram de me pedir para mudar um sistema para logar com facebook, aproveitei e fiz logo um post lol.

Já que o sistema usava devise lol mamão com açucar.

Adicione essas gems no arquivo gemfile.

1
2
gem "omniauth-facebook"
gem 'oa-oauth', :require => 'omniauth/oauth'

Agora vamos criar um controller para fazer o trabalho de login, crie um diretório users e logo em seguida um controller com nome omniauth_callbacks_controller dentro da pasta. Segue o código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def facebook
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

    if @user.persisted?
      flash[:notice] = I18n.t "devise.sessions.signed_in", :kind => "Facebook"
      sign_in_and_redirect @user, :event => :authentication
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to root_url
    end
  end

  def passthru
    render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
  end

end

Vamos adicionar o método find_for_facebook_oauth dentro do model User.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
    data = access_token.extra.raw_info
    if user = User.where(:email => data.email).first
      user
    else # Create a user with a stub password. 
      User.create!(:email => data.email, :password => Devise.friendly_token[0,20], :role => 'user')
    end
  end

  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 = data["email"]
      end
    end
  end

Não esqueça de habilitar a opção :omniauthable do devise no model User.

Vamos colocar as rotas no arquivo routes.rb

1
2
3
4
devise_for :users, :controllers => {:omniauth_callbacks => "users/omniauth_callbacks"}
devise_scope :user do
  get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru'
end

Agora abra o arquivo devise.rb que esta em config/initializers e bem no final habilite a opção abaixo:

config.omniauth :facebook, 'APP_ID', 'APP_SECRET'

Pegando sua APP_ID e APP_SECRET

Vá ate esse endereço https://developers.facebook.com/apps e clique no menu aplicativos depois em criar novo aplicativo de um nome para ele e clique em continuar.

Selecione o aplicativo e clique em editar aplicativo, na opção App Domain coloque:

Ex.: dominio.com.br

Clique em Website e coloque o endereço da aplicação

Ex.: http://dominio.com.br/

Agora é so pegar a APP_ID e APP_SECRET e substituir, não esqueça das aspas.

Adicione o link para logar na view e pronto lol.

<%= link_to "Conectar com Facebook", user_omniauth_authorize_path(:facebook) %>

Comments