martes, 16 de junio de 2009

Quiero logarme usando open ID

Lo primero es instalar la gema ruby-openid y el plugin open_id_authentication. Intenté usar directamente el plugin restful_open_id_authentication pero ya tenía montada una autenticación de tó la vida y preferí añadir únicamente la parte de open ID.

Ahora sólo queda seguir las instrucciones que encontramos en los links, pero con un par de matices:

  • Generamos las tablas que necesita el plugin

    > ruby script/generate open_id_authentication_tables MigrationName

    Esto generará una migration con las tablas open_id_authentication_associations y open_id_authentication_nonces, asi que...

    > rake db:migrate

    Si el modelo User aún no tiene un campo para almacenar el openid, tenemos que crearlo, claro está.

  • En el archivo de rutas nos aseguramos de que exista una ruta root y permitimos el acceso al método create del controlador sessions mediante GET

    map.open_id_complete 'session', :controller => "sessions", :action => "create", :requirements => {:method => :get }

  • En la vista correspondiente al login de la aplicación, añadimos un campo que contenga el openid del usuario.

    <%= text_field_tag 'identity_url' %>

  • Adaptamos sessions_controller para que ejecute el login contra openID cuando sea necesario. Basta con seguir las instrucciones que nos proporcionan los creadores del plugin, juntarlo con el código que tengamos para autenticar (en este caso, restful_authentication) y retocar un par de cosas.

    En el controller sessions_controller.rb

    def create
     if !params[:identity_url].blank? || request.get?
      open_id_authentication(params[:identity_url])
     else
      password_authentication
     end
    end

    protected
     def password_authentication
      self.current_user = User.authenticate(params[:login], params[:password])
      if logged_in?
       if params[:remember_me] == "1"
        current_user.remember_me unless current_user.remember_token?
        cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
       end
       successful_login "Logged in successfully"
      else
       failed_login "User and password do not match"
      end
     end

     def open_id_authentication(identity_url)
      authenticate_with_open_id(identity_url) do |status, identity_url|
       unless status.successful?
        failed_login status.message
       else
        if @current_user = User.find_by_identity_url(identity_url)
         successful_login
        else
         failed_login "Sorry, no user by that identity URL exists"
        end
       end
      end
     end

    y en el plugin, en open_id_authentication.rb

    def successful?
     @code == :successful
    end

Y a correr.

Salud y rocanrol. (hoy no hay ánimo para canciones, sorry)

1 comentario:

Inasacu dijo...

hola,

tambien esta la option de http://rpxnow.com que es much mas sencillo y es mas amplio ya que permite accesso con otras cuentas...