Warden OmniAuth
OmniAuth is a pretty aweome library. If you haven't checked it out yet, you really should. This is a simple wrapper for OmniAuth so that it can be used from a warden project. It sorts storing the user into the sesion, redirection on callbacks etc.
With it, you can make use of any of the OmniAuth authentication library. This provides some great external authentication mechanisms.
Warden provides a consistent interface for projects, engines, and arbitrary rack applicaitons. The benefit of warden, is that you do not need to know what the host application considers authentication to use it. It also provides a way to store the user in the session etc.
By using WardenOmniAuth, you can make use of any of the OmniAuth authentication mechanisms in your host application, and any rack middleware or applications can just continue using warden without change.
This is also usable in the Devise Rails Engine
Usage (Rack)
use OmniAuth::Builer do
# setup omniauth
end
use Warden::Manager do |config|
# setup warden configuration
end
use WardenOmniAuth do |config|
config.redirect\_after\_callback = "/redirect/path" # default "/"
end
run MyApp
Usage (Devise)
# config/initializer.rb
Devise.setup do |config|
config.warden do |manager|
[:omni\_twitter, :omni\_facebook, :omni\_github].each do |strategy|
manager.default\_strategies(:scope => :user).unshift strategy
end
end
This will add the stratgeies to the normal devise user login for github, then facebook, then twitter.
Dealing with callbacks
OmniAuth uses callbacks to give you the user object, WardenOmniAuth provides a way to store this into the session
By default, it grabs just user\info, uid, credentials, provider as a hash in the session.
If you want to customise this you can do:
WardenOmniAuth.on\_callback do |user|
# all callbacks will go here by default
end
Whatever you return from the block is the user that's made available in warden.
Dealing with each kind of callback
use WardenOmniAuth do |config|
Warden::Strategies[:omni\_twitter].on_callback do |user|
# do stuff to get a user and return it from the block
end
Warden::Strategies[:omni\_facebook].on_callback do |user|
# do stuff to get a user for a facebook user
end
end
This will use a specific callback to get the user, or fallback if nothing specific has been defined.
Why? (Gimmie an alternative)
Because I wanted to see how it would be to integrate this strategy into warden. Turns out to be pretty simple, but there's nothing stopping you from just providing a callback directly for OmniAuth.
However, it's just as simple to provide endpoints for OmniAuth callbacks. (Assuming you already have warden setup in your app)
Example:
get "/auth/twitter/callback" do
user = munge_user_from_env(env['rack.auth'])
warden.set_user user
redirect "/somewhere"
end
You can see from this small snippet, that you don't really need this library, just define your callbacks to set the user and you're done.
Rack is a beautiful thing!