Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Add facebook auth to a Clearance app, using omniauth-facebook
class Authentication < ActiveRecord::Base
belongs_to :user
def self.create_with_omniauth(auth_hash)
create! do |auth|
auth.provider = auth_hash["provider"]
auth.uid = auth_hash["uid"]
auth.token = auth_hash["credentials"]["token"]
end
end
def update_token(auth_hash)
self.token = auth_hash["credentials"]["token"]
self.save
end
end
gem 'omniauth'
gem 'omniauth-facebook'
gem 'clearance'
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, 'APP_KEY', 'APP_SECRET'
end
match "/auth/:provider/callback" => "sessions#create_from_omniauth"
class SessionsController < Clearance::SessionsController
def create_from_omniauth
auth_hash = request.env["omniauth.auth"]
authentication = Authentication.find_by_provider_and_uid(auth_hash["provider"], auth_hash["uid"]) || Authentication.create_with_omniauth(auth_hash)
if authentication.user
user = authentication.user
authentication.update_token(auth_hash)
@next = root_url
@notice = "Signed in!"
else
user = User.create_with_auth_and_hash(authentication,auth_hash)
@next = edit_user_path(user)
@notice = "User created - confirm or edit details..."
end
sign_in(user)
redirect_to @next, :notice => @notice
end
end
class User < ActiveRecord::Base
include Clearance::User
has_many :authentications, :dependent => :destroy
def self.create_with_auth_and_hash(authentication,auth_hash)
create! do |u|
u.first_name = auth_hash["info"]["first_name"]
u.last_name = auth_hash["info"]["last_name"]
u.friendly_name = auth_hash["info"]["name"]
u.email = auth_hash["extra"]["raw_info"]["email"]
u.authentications<<(authentication)
end
end
def fb_token
x = self.authentications.where(:provider => :facebook).first
return x.token unless x.nil?
end
def password_optional?
true
end
end
@dougalcorn
Copy link

dougalcorn commented Jul 30, 2012

Do you have the markup for the view to sign-up with omniauth?

@robsilva
Copy link

robsilva commented Nov 19, 2013

^ +1
Has anyone been able to get this to work in R4?

@hegeltrigo
Copy link

hegeltrigo commented Nov 23, 2013

excellent, thanks!

@martinstreicher
Copy link

martinstreicher commented Feb 17, 2014

Does this work in Rails 4?

Copy link

ghost commented Feb 20, 2014

yes

@andrewhavens
Copy link

andrewhavens commented Jan 5, 2015

This is a nice example. However, how do you get past the "password must be present" validation that Clearance adds, when creating from OmniAuth?

@victorclee
Copy link

victorclee commented Oct 8, 2020

Fantastic example. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment