Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@stevebourne
Created April 15, 2012 19:28
Show Gist options
  • Star 40 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save stevebourne/2394427 to your computer and use it in GitHub Desktop.
Save stevebourne/2394427 to your computer and use it in GitHub Desktop.
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
@hegeltrigo
Copy link

excellent, thanks!

@martinstreicher
Copy link

Does this work in Rails 4?

Copy link

ghost commented Feb 20, 2014

yes

@andrewhavens
Copy link

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

Fantastic example. Thanks!

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