Skip to content

Instantly share code, notes, and snippets.

@dira
Created December 1, 2010 01:56
Show Gist options
  • Save dira/722793 to your computer and use it in GitHub Desktop.
Save dira/722793 to your computer and use it in GitHub Desktop.
OmniAuth strategy for a custom provider
# config/initializers/omniauth.rb
module OmniAuth
module Strategies
# tell OmniAuth to load our strategy
autoload :Pixelation, 'lib/pixelation_strategy'
end
end
Rails.application.config.middleware.use OmniAuth::Builder do
provider :twitter, "app_name", "secret"
provider :facebook, "app_name", "secret", :scope => ''
# pass the 2 parameters to the constructor
provider :pixelation, "secret", "redirect URL"
end
# lib/pixelation_strategy.rb
require 'omniauth/core'
module OmniAuth
module Strategies
class Pixelation
include OmniAuth::Strategy
# receive parameters from the strategy declaration and save them
def initialize(app, secret, auth_redirect, options = {})
@secret = secret
@auth_redirect = auth_redirect
super(app, :pixelation, options)
end
# redirect to the Pixelation website
def request_phase
r = Rack::Response.new
r.redirect @auth_redirect
r.finish
end
def callback_phase
uid, username, avatar, token = request.params["uid"], request.params["username"], request.params["avatar"], request.params["token"]
sha1 = Digest::SHA1.hexdigest("a mix of #{@secret}, #{uid}, #{username}, #{avatar}")
# check if the request comes from Pixelation or not
if sha1 == token
@uid, @username, @avatar = uid, username, avatar
# OmniAuth takes care of the rest
super
else
# OmniAuth takes care of the rest
fail!(:invalid_credentials)
end
end
# normalize user's data according to http://github.com/intridea/omniauth/wiki/Auth-Hash-Schema
def auth_hash
OmniAuth::Utils.deep_merge(super(), {
'uid' => @uid,
'user_info' => {
'name' => @username,
'nickname' => @username,
'image' => @avatar
}
})
end
end
end
end
Copy link

ghost commented Aug 26, 2012

Do we have to get avatar in every oauth2 ? Or this is just an option ?

@abhishekthehulk
Copy link

i did d same as above u mentioned bt when i hit my apllication's URL i m getting error as undefined method `call' for #<Pixelation
??????

@shrikant-dm
Copy link

How can I test this strategy?

@matassi
Copy link

matassi commented Sep 8, 2018

???

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