#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)
Los participantes de la última edición del concurso Rails Rumble trataron de crear una aplicación Rails en 48 horas. La página de alta del concurso era interesante porque ofrecía la posibilidad de registrarse utilizando varios servicios diferentes.
Permitir a los usuarios iniciar sesión a través de diferentes servicios puede ser muy costoso de implementar pero el sitio de Rails Rumble evita esto utilizando Janrain, que proporciona un servicio llamado Janrain Engage (también conocido como RPX). Se trata de un servicio de autenticación centralizado; una API única que debe implementar una aplicación para permitir la autenticación a través de un gran número de servicios. Janrain es un servicio comercial, pero existe un plan básico que es perfecto para los concursantes de una Rails Rumble.
Alta en Engage
Es fácil darse de alta en el servicio básico de Janrain Engage, una vez hecho esto y asignado un nombre a nuestro aplicación iremos a la página de nuestra cuenta, donde tendremos que apuntar nuestra clave de API y el nombre de la aplicación, en este caso asciicasts
. También tendremos que configurar los servicios que queremos usar, si hacemos clic en la pestaña ‘Providers’ iremos a una página en la que podemos escoger con qué servicios podrán autenticarse los usuarios de nuestra aplicación.
El plan gratuito sólo permite escoger hasta seis proveedores, pero eso nos da la flexibilidad suficiente. Nótese que algunos de ellos requieren una configuración adicional. Por ejemplo para usar Twitter tendremos que configurar nuestra aplicación como cliente de OAuth (lo cual no es complicado) En nuestro caso nos quedaremos con los cuatro servicios por defecto.
Modificaciones en la aplicación para usar Engage
Una vez que nos hemos dado de alta podemos usar Engage en nuestra aplicación Rails. Si tuviésemos que implementar desde cero la autenticación podríamos utilizar la gema RPXNow que ofrece toda la funcionaidad necesaria para implementar Engage en una aplicación Rails. Si por el contrario estamos ya usando Authlogic podemos investigar una gema llamada Authlogic RPX. Por último existe la gema RPX Connectable que permite el uso de Engage con Devise. La aplicación con la que estamos trabajando en este episodio utiliza Devise por lo que usaremos esta última gema. Los que necesiten una introducción a Devise pueden encontrarla en el episodio 209 [verlo, leerlo].
En nuestra aplicación ya tenemos los enlaces de registro e inicio de sesión que llevan al usuario a un formuario sencillo que hay que rellenar con una dirección de correo y una clave.
Nuestro plan es cambiar estos enlaces por un único enlace que lleve al usuario a una página donde se pueden dar de alta a través de Engage. Para esto es para lo que utilizaremos la gema RPX Connectable.
Como es habitual, sólo tenemos que añadir una referencia en el fichero de gemas:
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'
Y luego la instalamos con
$ bundle install
Tenemos que añadir un campo rpx_identifier
en la tabla Users
de nuestra aplicación para poder utilizar RPX. Generaremos para esto una nueva migración.
$ rails g migration add_rpx_to_users rpx_identifier:string
Tras esto ya podemos ejecutar la migración para añadir el campo
$ rake db:migrate
A continuación tenemos que modificar la llamada a devise
en el modelo User
de forma que :rpx_connectable
aparezca en la lista de módulos.
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
Por último nos queda actualizar el fichero de configuración de Devise de la aplicación para especificar el nombre que le dimos a la aplicación cuando la dimos de alta en Engage, así como la clave de API privada que se nos dió:
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
Con todo esto ya podemos sustituir los enlaces de alta e inicio de sesión de nuestra aplicación en el fichero de layout de la aplicación con un enlace a la página de alta de Engage, pasando la URL a la que queremos volver cuando se termine el inicio de sesión:
<%= link_to_rpx "Sign in", user_session_url %>
Inicio de sesión
Ya tenemos el código para intentar iniciar la sesión. Cuando hagamos clic en el enlace de inicio de sesión de nuestra aplicación iremos a una página en el servidor de Janrain:
Podemos iniciar la sesión con una de los servicios anteriores y, suponiendo que hemos introducido correctamente las credenciales, volveremos a la aplicación.
Obsérvese que ahora tenemos una sesión iniciada en la aplicación.
Un inicio de sesión más vistoso
Si queremos que el panel de inicio de sesión sea una capa JavaScript en lugar de una página separada podemos incluir la siguiente línea de código justo antes de cerrar la etiqueta body
en la plantilla de layout.
<%= javascript_include_rpx(user_session_url) %>
Con esto nuestra aplicación incluirá el JavaScript necesario para mostrar una capa flotante en el sitio cuando el usuario quiere iniciar la sesión.
También se podría, como alternativa, incluir el panel de inicio de sesión utizando un iframe. Para esto tenemos que añadir la siguiente línea de código en la vista:
<%= embed_rpx user_session_url %>
Es mejor poner este código cerca de los formularios de registro o inicio de sesión para dar una forma alternativa de registrarse.
Todo lo que hemos visto en este episodio se encuentra documentado en el fichero README
de Devise RPX Connectable junto con otras opciones que se pueden pasar para requerir información adicional sobre los usuarios registrados.