homeASCIIcasts

233: Engage y Devise 

(view original Railscast)

Other translations: En It Fr

Other formats:

Written by Juan Lupión

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.

Página de inicio de sesión de Rails Rumble.

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.

Los proveedores de autenticación que podemos escoger en 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.

La página de inicio de sesión de nuestra aplicación.

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:

/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'

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.

/app/models/user.rb

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ó:

/config/initializers/devise.rb

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:

/app/views/layouts/application.html.erb

<%= 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:

Ya podemos iniciar la sesión con Engage.

Podemos iniciar la sesión con una de los servicios anteriores y, suponiendo que hemos introducido correctamente las credenciales, volveremos a la aplicación.

Inicio de sesión correcto con Google.

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.

/app/views/layouts/application.html.erb

<%= 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.

Inicio de sesión con un panel emergente

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 fomrulario de registro o inicio de seesió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.