Autenticación de Usuarios en Controladores Rails

Clase 23 de 33Curso de Creación de APIs con Ruby on Rails

Resumen

¿Cómo autenticar a un usuario en Ruby on Rails?

En la creación de aplicaciones fluye la necesidad de restringir ciertas acciones a usuarios autenticados, garantizando seguridad y personalización en el acceso a la información. Ruby on Rails ofrece herramientas robustas para implementar autenticación y autorización. Exploramos cómo hacer esto en el contexto de un controlador que gestiona las acciones de crear y actualizar publicaciones.

¿Qué es el Before Action en Rails y cómo se utiliza?

El before_action es una herramienta que proporciona Rails para ejecutar una función específica antes de ciertas acciones de un controlador. Este aspecto es crucial para asegurar que procedimientos como la creación y actualización de publicaciones solo se realicen si el usuario está autenticado.

before_action :authenticate_user!, only: [:create, :update]

En este fragmento, el método authenticate_user! se ejecutará antes de las acciones create y update.

¿Cómo implementar el método authenticate_user!?

Este método es el núcleo de la autenticación. Su implementación se realiza como un método privado en el controlador. La autenticación se basa en el uso del header de autorización del request, verificando que el formato y el token presente en él sean válidos.

  1. Leer el Header de Autenticación: Verifica su presencia y que cumpla con el formato esperado, utilizando una expresión regular.

    if request.headers['Authorization'] =~ /Bearer (.+)/
      token = $1
    else
      render json: { error: 'Unauthorized' }, status: :unauthorized
      return
    end
    
  2. Verificar el Token: A través del modelo User, verifica que el token corresponde a un usuario válido.

    user = User.find_by(auth_token: token)
    
  3. Manejo de Usuario: Si el usuario es encontrado, es asignado como usuario actual, accesible en el contexto de la aplicación.

    if user
      Current.user = user
    else
      render json: { error: 'Unauthorized' }, status: :unauthorized
    end
    

¿Cómo se gestiona el usuario actual con Current Attributes?

Rails 5 introduce Current Attributes, una herramienta para guardar y acceder al contexto de la aplicación en la sesión actual. Implementar esto implica:

  • Definir una clase Current, dentro de la carpeta de modelos, que hereda de ActiveSupport::CurrentAttributes.
class Current < ActiveSupport::CurrentAttributes
  attribute :user
end
  • Asignar el usuario identificado al atributo correspondiente.
Current.user = user

Esta configuración permite que cualquier parte de la aplicación pueda referirse al usuario actual mediante Current.user, simplificando el acceso a información contextual.

¿Por qué usar current_user en lugar de session o cookies?

Utilizar Current ofrece una ventaja significativa: aislamiento de contexto. Permite un manejo más limpio y menos propenso a errores comparado con sesiones o cookies, en especial en aplicaciones que emplean múltiples hilos o procesos. Esta técnica resulta en código más mantenible y seguro, apoyando la integración fluida de la autenticación en aplicaciones Rails.

Al incorporar un flujo de autenticación robusto y mantener el estado del usuario con clases como Current, no solo límite de acceso a funciones específicas, sino que ofrece un sistema escalable que permite a los desarrolladores centrarse en expandir otras funcionalidades de la aplicación, sabiendo que la seguridad está bien gestionada. Si te interesa seguir profundizando en Ruby on Rails y sus herramientas, la práctica constante te hará dominar más allá de los conceptos básicos. ¡Sigue programando!