#233 Engage with Devise
- Download:
- source codeProject Files in Zip (115 KB)
- mp4Full Size H.264 Video (14.2 MB)
- m4vSmaller H.264 Video (8.22 MB)
- webmFull Size VP8 Video (17.9 MB)
- ogvFull Size Theora Video (19.6 MB)
Nella recente gara Rails Rumble i partecipanti hanno provato a creare un’applicazione Rails in 48 ore. La pagina di login alla competizione era interessante, perchè permetteva di autenticarsi mediante una serie di servizi differenti.
Dare la possibilità di autenticarsi mediante una serie di servizi differenti può richiedere uno sforzo notevole in termini di sviluppo, ma il sito Rails Rumble ha risolto il problema usando Janrain, che fornisce un servizio chiamato Janrain Engage (conosciuto anche come RPX). Si tratta di un servizio di autenticazione centralizzato; c’è un API con cui una applicazione può comunicare per abilitare l’autenticazione mediante una pletora di altri provider. Janrain è un servizio commerciale, ma ne esiste anche una versione gratuita, più limitata, che va più che bene per gli scopi di un sito come Rails Rumble.
Autenticazione mediante Engage
L’autenticazione basilare mediante il servizio Janrain Engage à semplice. Una volta registrati al servizio e aver fornito un nome per la nostra applicazione, veniamo portati alla home page del nostro account. Da qui dobbiamo prendere nota della chiave per le API e del nome dell’applicazione, in questo caso ‘asciicasts’. Dobbiamo anche dichiarare i provider che desideriamo usare. Se ci autentichiamo e poi clicchiamo sul tab ‘Providers’, veniamo portati a una pagina da cui potremo scegliere i servizi attraverso i quali gli utenti della nostra applicazione potranno autenticarsi:
L’account gratuito consente solo di scegliere fra sei provider, ma già questi sono sufficienti per darci un’ampia scelta. Si noti che alcuni di questi richiedono una configurazione extra. Per esempio, per usare Twitter, dovremmo configurare la nostra applicazione come un client OAuth, ma è piuttosto semplice farlo. Per la nostra applicazione, useremo i quattro provider proposti per default.
Modifichiamo la nostra applicazione per usare Engage
Ora che ci siamo registrati, possiamo utilizzare Engage in un’applicazione Rails. Se stessimo creando un meccanismo di autenticazione partendo da zero,potremmo utilizzare il gem RPXNow, che offre molte funzionalità per aiutarci a usare Engage nella nostra applicazione. Se la nostra applicazione usava già Authlogic, esiste un gem denominato Authlogic RPX, che vale la pena di considerare. Infine c’è il gem RPX Connectable per l’utilizzo con Devise. L’applicazione con cui stiamo lavorando in questo episodio usa Devise, per cui utilizziamo proprio quest’ultimo gem per integrare Engage in esso. Se non conoscete bene Devise, date uno sguardo all’episodio 209 [guardalo, leggilo] per una breve presentazione.
La nostra applicazione ha già i collegamenti “Sign up” e “Sign in” che portano l’utente ad una semplice form da riempire con un indirizzo email e una password:
Vogliamo sostituire questi link con uno unico che conduce l’utente a una pagina dove può autenticarsi mediante Engage ed è proprio qui che potremo avvalerci del gem RPX Connectable.
Per usare il gem nella nostra applicazione dobbiamo innanzitutto aggiungerne il riferimento nel Gemfile
:
source 'http://rubygems.org' gem 'rails', '3.0.0' gem 'sqlite3-ruby', '1.2.5', :require => 'sqlite3' gem 'devise' gem 'nifty-generators' gem 'devise_rpx_connectable'
e poi installarla con:
$ bundle install
Per usare RPX, dobbiamo aggiungere un campo rpx_identifier
alla nostra tabella Users
. Genereremo una nuova migrazione per fare ciò:
$ rails g migration add_rpx_to_users rpx_identifier:string
Poi possiamo lanciare la migrazione per aggiungere il nuovo campo:
$ rake db:migrate
Poi dobbiamo modificare la chiamata a devise
nella classe di modello User
, affinchè abbia :rpx_connectable
nella sua lista di module:
class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :rpx_connectable # Setup accessible (or protected) attributes for your model attr_accessible :email, :password, :password_confirmation end
Infine dobbiamo aggiornare il file di configurazione di Devise della nostra applicazione per indicare il nome che abbiamo utilizzato per la nostra applicazione quando ci siamo registrati per essa ad Engage, oltre alla chiave API che ci è stata fornica:
Devise.setup do |config| # Configure the e-mail address which will be shown in DeviseMailer. config.mailer_sender = "test@example.com" config.rpx_application_name = 'asciicasts' RPXNow.api_key = "aaabbbcccdddeeefff" # real key goes here. end
Ora che abbiamo configurato tutto, possiamo sostituire i due link “Sign up” and “Sign in” nel file di layout con l’unico link alla pagina di autenticazione Engage, passando l’URL a cui vogliamo ritornare subito dopo l’autenticazione:
<%= link_to_rpx "Sign in", user_session_url %>
Autenticazione
Abbiamo tutto il codice in regola per provare ad autenticarci. Quando clicchiamo sul link di “Sign in” nella nostra applicazione, verremo ridiretti ad una pagina presente sui server di Janrain:
Possiamo ora autenticarci usando uno degli account proposti qui sopra e, nell’ipotesi che abbiamo inserito correttamente i nostri dati, saremo ridiretti alla nostra applicazione:
Si noti che ora siamo autenticati nella nostra applicazione.
Una pagina di login migliore
Se volessimo che il pannello di log-in fosse più carino, facendolo diventare un overlay Javascript, anzichè una pagina a parte, potremmo farlo includendo la seguente linea di codice subito prima del tag di chiusura del body nel file di layout:
<%= javascript_include_rpx(user_session_url) %>
Ciò aggiungerà del JavaScript alla nostra applicazione, che mostrerà un overlay sul sito quando uno tenta di autenticarsi:
In alternativa potremmo inserire il pannello di autenticazione ovunque nella nostra applicazione, usando un iframe. Per farlo, tutto ciò che dovremmo fare sarebbe di aggiungere la seguente linea di codice da qualche parte nel codice della vista:
<%= embed_rpx user_session_url %>
Questo codice è bene metterlo da qualche parte vicino alla maschera di login, per consentire un metodo alternativo di autenticazione.
Tutto ciò che vi abbiamo mostrato in questo episodio si trova nel file README di Devise RPX Connectable, insieme ad alcune informazioni su certe opzioni aggiuntive che possono essere passate affinchè sia possibile richiedere informazioni aggiuntive su ciascun utente autenticato.