Oauth!

Usare oauth senza voler creare alcun processo di login diverso? Googlando in giro sembra che nessuno lo faccia, anche perché nessuno parla della keyword magica:

:allow_login => true

Partiamo dall'inizio: usando oauth-plugin per Rails3, seguendo passo passo le istruzioni, non autentica e da accesso negato, finché non si aggiunge nelle OAUTH_CREDENTIALS, la keyword sopra, ad esempio:

OAUTH_CREDENTIALS = { 
  :google=>{
    :allow_login => true,
    :key=>"anonymous", 
    :secret=>"anonymous",
    :scope=>"https://www.google.com/calendar/feeds/"
  } 
}

Nasce poi un secondo problema: non crea l'utente in automatico, questo perché il modello ConsumerToken inserisce

before_create :create_user
mentre la forma corretta è
after_initialize :create_user

così finalmente, ci si autentica e si crea in automatico l'utente!

La sequenza per provare il tutto:

rails new oauth_test
cd oauth_test
rails generate model user nome:string cognome:string
rails generate controller home index
rails generate oauth_consumer user

In Gemfile aggiungere:

gem 'oauth-plugin', ">=0.4.0.pre5"
gem 'oauth'
gem 'rake', "0.8.7"

In config/initializers/oauth_consumers.rb aggiungere:

OAUTH_CREDENTIALS = { 
  :google=>{
    :allow_login => true,
    :key=>"anonymous", 
    :secret=>"anonymous",
    :scope=>"https://www.google.com/calendar/feeds/"
  } 
}

In app/controllers/application_controller.rb

def logged_in?
  session[:user_id]
end
def current_user
  session[:user_id] ? User.find_by_id(session[:user_id]) : nil
end
def current_user=(user)
  session[:user_id] = user.id
end

In app/models/consumer_token.rb

#SOSTIUIRE
#before_create :create_user
#CON
after_initialize :create_user

Infine in app/models/user.rb

has_one :google, :class_name=>"GoogleToken", :dependent=>:destroy 

E adesso possiamo provare:

rake db:migrate
rails s &
firefox http://localhost:3000/oauth_consumers/google