#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)
Pour Rails Rumble, qui a eu lieu récemment, les participants ont tenté de créer une application Rails en 48 heures. La page de connexion pour la compétition était intéressante. Elle permettait de se connecter via un certain nombre de services.
Proposer une connexion au travers de différents services peu prendre un certain temps à implémenter. Cependant, le site de Rails Rumble a résolu ce problème grâce à Janrain, qui fournit un service appelé Janrain Engage (également connu sous le nom RPX). C'est un système de centralisation de l'authentification ; une API qu'une application peut utiliser pour permettre l'authentification via un grand nombre de fournisseurs. Janrain est un service commercial mais il existe une offre Basique gratuite, ce qui est parfait pour quelque chose comme Rails Rumble.
S'inscrire sur Engage
S'inscrire au service basique de Janrain Engage est très simple. Une fois que nous sommes inscrits et que nous avons fourni un nom pour notre application, nous sommes redirigés vers la page d'accueil de notre compte. Nous devons ici récupérer notre clé d'API et le nom de notre application, dans notre cas, “asciicasts”. Nous devons également choisir la liste des fournisseurs que nous souhaitons utiliser. Si nous nous connectons et cliquons sur l'onglet “Providers”, s'affiche une page listant les services que notre application peut utiliser.
L'offre gratuite nous permet de prendre jusqu'à six fournisseurs, cela nous laisse un large choix. Notez cependant que certains d'entre eux requièrent un peu de configuration supplémentaire. Pour utiliser Twitter par exemple, nous devons configurer notre application comme client OAuth mais cela est assez facile à réaliser. Pour notre application nous allons utiliser les quatre fournisseurs par défaut.
Modifier notre application pour qu'elle utilise Engage
Maintenant que nous sommes inscrits, nous pouvons utiliser Engage dans une application Rails. Si nous devions créer une authentification from scratch, nous pourrions utiliser la gem RPXNow qui fournit de nombreuses fonctionnalités pour faciliter l'utilisation d'Engage. Si notre application utilisait Authlogic, il existe la gem Authlogic RPX qui vaudrait la peine d'être regardée. Enfin, il existe la gem RPX Connectable pour fonctionner avec Devise. L'application sur laquelle nous travaillons dans cet épisode fonctionne avec Devise, nous utiliserons donc cette dernière pour passer par Engage. Si vous n'êtes pas familiarisé avec Devise, prenez le temps de jeter un œil à l'épisode 209 [regarder, lire] pour une introduction.
Notre application a déjà les liens “Inscription” et “Connexion” qui mènent à un formulaire assez simple dans lequel il faut saisir une adresse e-mail et un mot de passe.
Nous voulons remplacer ces liens par un seul pointant sur une page où l'utilisateur peut se connecter via Engage et c'est là que nous allons utiliser la gem RPX Connectable.
Pour utiliser la gem dans notre application, nous devons juste y faire référence dans le 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'
Ensuite, installez-la grâce à
$ bundle install
Pour utiliser RPX, nous avons besoin d'un champ rpx_identifier
dans notre table users
. Nous allons donc générer une migration pour le faire.
$ rails g migration add_rpx_to_users rpx_identifier:string
Nous pouvons ensuite lancer la migration pour ajouter le nouveau champ.
$ rake db:migrate
Nous devons modifier l'appel à devise
dans le modèle User
de manière à ce qu'il ait :rpx_connectable
dans sa liste de modules.
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
Enfin, nous devons mettre la configuration Devise de notre application à jour pour spécifier le nom que nous avons donné pour Engage ainsi que notre clé d'API.
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
Maintenant que tout est en place, nous pouvons remplacer les liens “Inscription” et “Connexion”, dans le layout, par un lien pointant vers la page de connexion d'Engage en passant en paramètre la page vers laquelle on veut être redirigé une fois la connexion effectuée.
<%= link_to_rpx "Connexion", user_session_url %>
Connexion
Nous avons maintenant le code nécessaire pour une tentative de connexion. Lorsque l'on clique sur le lien “Connexion” de notre application, nous sommes bien redirigés vers le serveur de Janrain.
Nous pouvons maintenant nous connecter au travers d'un des comptes ci-dessous, si nous rentrons les informations correctes, et nous sommes redirigés vers notre application.
Notez que nous sommes maintenant connectés sur l'application.
Un meilleur formulaire de connexion
Si vous souhaitez que le formulaire de connexion soit un panneau déroulant sympa au lien d'une page séparée, c'est possible en ajoutant ces quelques lignes de code juste avant la balise body fermante dans le layout :
<%= javascript_include_rpx(user_session_url) %>
Cela va ajouter à notre application un peu de JavaScript qui affiche un panneau déroulant sur le site quand l'utilisateur essaie de se connecter.
Nous pourrions également inclure note formulaire de connexion n'importe où dans l'application au travers d'une iframe. Pour ce faire, il nous suffit d'ajouter le code suivant dans le code de vue :
<%= embed_rpx user_session_url %>
Ce code sera, au mieux, placé quelque part autour des formulaires d'inscription ou le connexion pour fournir une alternative de connexion.
Tout ce qui a été montré dans cet épisode est écrit dans le README de RPX Connectable. On y trouve également la liste des options supplémentaires que l'ont peut passer afin de récupérer d'autres informations à propos de l'utilisateur connecté.