acquisto viagra originale sildenafil prezzo levitra viagra cialis differenze vendita cialis senza ricetta durata levitra cialis femminile viagra naturale farmacia cialis prezzo in farmacia cialis miglior prezzo viagra costa viagra generico in farmacia kamagra controindicazioni cialis pasti acquistare viagra cialis generico opinioni viagra cialis differenza cialis vendo viagra generico contrassegno cialis rosa cialis da 2 5 mg cialis generico 5mg cialis caratteristiche compra viagra generico viagra roma viagra generico funziona comprare viagra in internet viagra x le donne prezzo levitra 10 mg ordina cialis viagra female acquista cialis generico confezioni cialis cialis generico costo cialis pagamento alla consegna cialis farmacia senza ricetta viagra generico in italia erboristeria viagra naturale farmacie viagra comprare cialis su internet vendita cialis generico levitra acquisto costi cialis levitra confezioni e prezzi levitra 10 mg costo cialis pagamento contrassegno levitra prezzo vendita viagra in italia viagra naturale per donne prezzo farmacia cialis farmaco levitra cialis prescrizione medica cialis da banco levitra in farmacia medicinale levitra cialis torrino prezzo cialis 10 cialis prezzo in farmacia acquisto cialis senza ricetta cialis generico sicuro levitra vendita sildenafil dosaggio vendita cialis san marino viagra vendita libera viagra per femmine viagra generico opinioni viagra da banco cialis da banco viagra serve la ricetta comprare cialis online viagra online sicuro viagra euro prezzi viagra cialis o simili acquisto cialis in farmacia levitra 10 mg generico cialis su internet acquistare cialis generico cialis medicinale comprare cialis in contrassegno prezzo cialis generico impotenza rimedi cialis effetti collaterali viagra generico online cialis o simili cialis acquisto on line compra cialis in italia cialis benefici cialis farmaco levitra 20 mg levitra costo cialis caratteristiche acquisto cialis on line cialis 5 mg prezzo cialis san marino tadalafil principio attivo cialis comprare comprare viagra viagra costo costo cialis generico cialis costa acquisto viagra net levitra ci vuole ricetta comprare cialis a san marino levitra contrassegno viagra sostituto kamagra opinioni levitra contrassegno viagra alternativo acquisto cialis svizzera viagra per donne viagra a san marino cialis originale cialis generico opinioni cialis in contrassegno cialis vendita libera viagra prezzi in farmacia cialis pagamento paypal comprare cialis sicuro viagra quanto costa in farmacia differenze cialis viagra cialis prezzo acquisto viagra net cialis prezzo farmacia levitra costo in farmacia acquistare cialis su internet acquistare viagra in italia cialis fa bene viagra x le donne sildenafil 100 mg viagra naturale funziona cialis generico costo viagra generico in farmacia acquista levitra vendita cialis italia viagra compresse cialis costo viagra farmacie kamagra funziona offerte viagra viagra per donne viagra donna cialis al naturale dosaggio viagra prezzo viagra farmacia sildenafil generico levitra acquista levitra originale viagra sottobanco vendo cialis milano viagra fa bene viagra 100 prezzo cialis 20 mg prezzo in farmacia prescrizione cialis acquistare cialis in farmacia aquisto viagra comprare viagra svizzera cialis farmaco benefici viagra viagra cialis differenze viagra alle donne levitra farmaco prezzo tadalafil farmaci impotenza viagra e cialis differenze viagra svizzera cialis alle erbe tadalafil 10 mg cialis fa bene viagra medicinale viagra compresse cialis vendita in farmacia viagra pasti levitra 5 mg prezzo viagra senza ricetta in svizzera cialis generico 10 mg viagra costo effetti viagra sulle donne levitra costo viagra x donne levitra ricetta medica acquisto cialis acquisto levitra online cialis 10 mg cialis super active levitra informazioni sildenafil prezzo viagra meccanismo d'azione cialis controindicazioni cialis vendita in italia viagra vendita in italia viagra dogana viagra femminile naturale vendita viagra san marino costo cialis in francia levitra generico in farmacia levitra generico online acquistare cialis acquistare levitra prescrizione viagra compro levitra femminile viagra viagra informazioni vendita viagra san marino viagra torino libera vendita cialis costo levitra 10 mg vendita cialis cialis alle erbe viagra acquisto sicuro viagra prezzo farmacia viagra alle erbe viagra naturale femminile costo levitra cialis euro tadalafil farmacia viagra nelle donne vendo cialis milano curare impotenza viagra a basso costo viagra naturale in erboristeria tadalafil effetti collaterali cialis recensioni cialis italia cialis 20 mg originale viagra rosa per donne comprare viagra internet farmaci impotenza compresse levitra viagra da 25 vendo viagra milano viagra acquisto sicuro cialis originale vendita comprare viagra in farmacia comprare cialis in svizzera viagra da 25 mg viagra modalità d'uso viagra ricetta ripetibile cialis per donne prezzo viagra 50 mg female viagra femigra viagra a san marino curare impotenza viagra ricetta libera vendita cialis prezzo levitra viagra offerte vendita cialis in contrassegno cialis compresse 5 mg cialis forum al femminile generico levitra comprare levitra viagra euro acquisto levitra tadalafil generico farmacia viagra erbe viagra farmaco generico cialis torino viagra acquistare cialis generico forum cialis compresse cialis generico india cialis dosaggio tadalafil effetti collaterali dosaggio levitra levitra 5 mg prezzo sildenafil donne viagra compra viagra e simili cialis europa svizzera viagra cialis recensioni levitra medicinale prezzi cialis cialis cialis differenze farmaco cialis ordina viagra comprare cialis sicuro cialis durata effetto levitra generico cialis 5 mg quanto costa comprare viagra in svizzera viagra prezzo farmacia compra viagra online viagra dove comprarlo acquista cialis on line cialis 20 mg effetti collaterali cialis generico sicuro cialis rosa viagra da 25 acquisto viagra levitra opinioni ricetta cialis cialis senza prescrizione acquistare cialis online cialis 20 mg in farmacia acquisto viagra svizzera cialis 5 mg quanto costa cura impotenza vendita cialis generico in italia vendo cialis napoli comprare cialis originale vardenafil costo viagra cialis levitra differenze cialis roma compro viagra online viagra 100 mg prezzo viagra in farmacia viagra originale cialis medicinale cialis comprare online viagra in contrassegno tadalafil in farmacia comprare viagra senza ricetta kamagra generico viagra quanto costa in farmacia levitra da 20 svizzera viagra cialis naturale funziona viagra senza ricetta forum cialis professional vendita cialis originale acquistare viagra farmacia levitra vendita viagra contrassegno comprare cialis senza ricetta costo cialis 20 mg cialis 20 mg originale cialis 5 mg generico cialis generico funziona viagra generico vendita impotenza sessuale cialis vendita on line vendita cialis generico in italia levitra originale prezzo disfunzione erettile rimedi costo cialis 5 mg cialis italia vendita cialis senza ricetta vendita viagra senza ricetta levitra donna compro viagra generico pasticche cialis viagra senza prescrizione prezzo viagra in farmacia viagra generico prezzo cialis farmacia prezzo compra viagra originale viagra super acquisto viagra in farmacia differenze cialis viagra levitra costo cialis

Rails, OpenID, and Acts as Authenticated

5 Mar 2007

This weekend I added OpenID to a Rails application for the first time, and this blog post describes the steps I took to integrate OpenID with Acts as Authenticated for account creation and access.

First I installed David’s OpenID Rails plugin (as discussed at David’s blog) into my application which was already using AAA to handle account creations and logins. I then created the following migration to add the OpenID identity URL to my user model:


class AddOpenId < ActiveRecord::Migration
def self.up
add_column :users, :identity_url, :string
end

def self.down
remove_column :users, :identity_url
end
end

And I changed the User model to allow accounts to be created either with login/email/password or with only an identity url (only changed lines are listed):


class User < ActiveRecord::Base
validates_presence_of :login,
:email, :if => :not_openid?
validates_length_of :login,
:within => 3..40, :if => :not_openid?
validates_length_of :email,
:within => 3..100, :if => :not_openid?
validates_uniqueness_of :login, :email, :salt, :allow_nil => true

def password_required?
not_openid? && (crypted_password.blank? or not password.blank?)
end

def not_openid?
identity_url.blank?
end
end

This allows me to create User records without the usual required fields as long as the user created the account via an OpenID login.

And finally, the controller changes:

class AccountController < ApplicationController
def login
if using_open_id?
open_id_authentication
elsif params[:login]
password_authentication(params[:login], params[:password])
end
end

protected

def password_authentication(login, password)
if self.current_user = User.authenticate(params[:login], params[:password])
successful_login
else
failed_login("Invalid login or password")
end
end

def open_id_authentication
authenticate_with_open_id do |result, identity_url|
if result.successful?
if self.current_user = User.find_or_create_by_identity_url(identity_url)
successful_login
else
failed_login "Sorry, no user by that identity URL exists (#{identity_url})"
end
else
failed_login result.message
end
end
end

private

def successful_login
redirect_back_or_default(index_url)
flash[:notice] = "Logged in successfully"
end

def failed_login(message)
redirect_to(:action => 'login')
flash[:warning] = message
end
end

That’s it! You can see it in action at the Rails plugin directory.

Update
I updated this code to match the plugin changes that were made between the time I installed the plugin and the time I posted this entry. :)

Update 2
I made another change to the code based on Geoff’s comment. Thanks, Geoff!


Actions

Informations

14 responses to “Rails, OpenID, and Acts as Authenticated”

Chris (12:15:16) :

Nice post. We’ve been looking into the OpenID thing and it definitely looks like it’s a simple enough thing to add.

Leancode » OpenIDAuthentication tutorial (13:46:10) :

[...] This morning, Ben Curtis put up an excellent, short tutorial on using this plugin on an existing site. [...]

Bernie Thompson (21:56:23) :

Ben,

With the latest rev of the DHH plugin (6334), did you hit this error when processing openid complete?

NoMethodError (You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.downcase):
.//vendor/plugins/open_id_authentication/lib/open_id_authentication.rb:43:in `normalize_url’
.//vendor/plugins/open_id_authentication/lib/open_id_authentication.rb:62:in `normalize_url’
.//vendor/plugins/open_id_authentication/lib/open_id_authentication.rb:95:in `complete_open_id_authentication’

I may have messed something up in my config…

Bernie

Ben (22:17:46) :

Yes, Bernie, I ran into a problem with this changeset which changed how the results were returned in complete_open_id_authentication. In my copy of the plugin I changed those yields back to just returning the symbols to match what my controller code was expecting.

Bernie Thompson (23:42:27) :

Thanks, Ben! I reverted the same. Took me a while to figure out what was going on, made worse missing else clause in the README recommended code

def open_id_authentication
authenticate_with_open_id do |result, identity_url|
case result
when :missing
….

Which caused the mismatch result codes to fall through. Thanks again.

noin (14:36:08) :

I just added “attr_reader :code” to the beginning of OpenIdAuthentication::Result and used result.code in the case statement.

7 OpenID Resources for Rails Developers (08:46:59) :

[...] 3) Ben Curtis demonstrates how to tie in OpenID with the popular Acts As Authenticated plugin. [...]

Bob (15:01:24) :

In the AccountController, where is using_open_id? defined? I’ve tried to follow along with your example but Rails dies with unknown method.

FWIW, I’ve been trying for weeks to combine OpenID authentication with a straightforward role-based authorization scheme (e.g. the Authorized plugin.) The OpenID guestbook at http://rorek.org/blog/Simple_Rails_OpenID_Guestbook got very close as did http://identity.eastmedia.com/identity/show/Bookmarks+Demo+Application but neither consider roles. Backfitting even simple RBAC into the demo apps has been prohibitively painful.

Ben (15:04:17) :

@Bob:

It’s defined in the plugin.

sol (04:08:38) :

does anyone here know how one would do the registration for this?
DHH in his example with registration, checks for the identity_url in the user table, and if found, adds the user info.
So the users have to register their url before? I don’t really understand this.
Wouldn’t it be better to just add the identity if it is not existing, and update the details, on login if it is found?

Geoff (15:05:24) :

Instead of messing with the plugin code you can boil that whole case statement down if you use the OpenIdAuthentication::Result#successful? or OpenIdAuthentication::Result#unsuccessful? methods. Here is how I my open_id_authentication method looks.

I don’t know if this will layout right in the comment. Ben feel free to fix it for me ;)


def open_id_authentication
authenticate_with_open_id do |result, identity_url|
if result.successful?
if self.current_user = User.find_or_create_by_identity_url(identity_url)
successful_login
else
failed_login "Sorry, no user by that identity URL exists (#{identity_url})"
end
else
failed_login result.message
end
end
end

Thanks for the guide. Helped me integrate it with the RestfulAuthentication plugin.

Ben (07:57:51) :

@Geoff

Thanks for the tip. I have updated the code in the post.

Nicolás Orellana, Entre viajes y Orelworks! » Blog Archive » Todo lo que tienes que saber sobre OpenID (15:47:48) :

[...] Si trabajas en Rails existen muchos recursos e incluso una gema para lograrlo y también de como ajustarlo al famoso acts_as_authenticated. [...]

Bob (20:11:59) :

Ah – I missed all the hidden steps of installing the open_id_authentication plugin, running migrations, setting index_url, etc. It’s still not clear in the code how one signs up with an OpenID URL – it takes more than simply adding an openid_url field in signup.rhtml

Thanks for clarifying this a bit; it’s just demoralizing trying to tie together OpenID, one of a half-dozen authentication plugins/engines/schemes, and a straightforward authorization system. As usual, what ought to be a simple matter of installing a turnkey auth scheme is taking far more effort than the entire rest of the application. This has been true each of the three times I’ve attempted a Rails application and I don’t see things getting better overall…

If I can get some cooperation from the Austin on Rails group, I’ll solve this problem for the next 6 months (until core Rails changes enough to deprecate key components without providing replacements – I’m thinking of UserEngine…) and write it up so I’m not accused of pointless bitching. :)