Autenticación de Usuarios en Controladores Rails
Clase 23 de 33 • Curso de Creación de APIs con Ruby on Rails
Contenido del curso
Proyecto
- 3

Creación de APIs con Rails: Proyecto Blog API paso a paso
04:37 min - 4

Configuración de Gemas para Pruebas en Proyectos Rails
06:26 min - 5

Configuración de Gemas en Proyectos Rails: Arspec, Factory Bot y Database Cleaner
07:25 min - 6

Implementación de un Health Check Endpoint en API con RSpec
12:28 min - 7

Diseño de Casos de Uso y Diagramas de Entidad para Aplicaciones
03:16 min - 8

Diagrama entidad relación: usuario y post
01:41 min - 9

Modelado de Aplicaciones con TDD en Rails
05:59 min - 10

Validaciones y Pruebas TDD en Rails: Modelos USR y Post
07:07 min - 11

Implementación de Endpoints para Listar y Mostrar Posts con TDD
15:12 min - 12

Implementar controlador Posts con TDD
10:34 min - 13

Pruebas TDD para crear y actualizar posts
10:12 min - 14

Implementación de Métodos y Manejo de Excepciones en Rails API
10:23 min - 15

Active Model serializers: control total de JSON en Rails
06:03 min - 16

Búsqueda y Filtrado de Posts por Título con TDD
05:57 min - 17

Implementación de Búsqueda de Posts con Servicios en Rails
06:06 min - 18

Problema N+1 en Rails: Detección y Solución Eficaz
04:40 min - 19

Identificación y solución del problema N+1 en Rails
06:20 min - 20

Flujo de Autenticación en APIs con Tokens y Proveedores
05:29 min - 21

Tests con RSpec para autenticación de tokens
12:17 min - 22

Autenticación con Tokens: Implementación en Rails API
05:53 min - 23

Autenticación de Usuarios en Controladores Rails
Viendo ahora - 24

Autenticación y Seguridad en CRUD de Posts en Rails
09:17 min - 25

Pruebas de Creación y Actualización con Autenticación en Rails
14:21 min - 26

Probando API Ruby on Rails con Postman
10:43 min - 27

Caching en Aplicaciones Web: Funciones y Niveles
07:15 min - 28

Aceleración de Búsquedas en Rails con Caching
08:23 min - 29

Background Jobs en Rails: Conceptos y Funcionalidades
05:45 min - 30

Procesamiento en Background y Envío de Correos con Rails
09:45 min - 31

Envío de Correos en Rails con ActionMailer y Background Jobs
11:06 min - 32
Autenticación y Autorización con JWT y Auth0 en Aplicaciones Web
03:48 min
Cierre
Implementa autenticación en Rails 5 con seguridad y claridad: usa before_action, valida el header Authorization con regex, resuelve el usuario por token y comparte el contexto con Current. Con esto, proteges create y update, y controlas el acceso en show a posts públicos y borradores del usuario autenticado.
¿Cómo asegurar create y update con before_action?
Para proteger las acciones sensibles, se configura un before_action que ejecute authenticate_user! solo antes de create y update. Así, cada request que pueda modificar datos verifica primero que exista un usuario válido.
¿Qué hace authenticate_user! en el controlador?
- Lee el header de autenticación del request.
- Verifica que exista el header Authorization.
- Valida el formato del header: "bitter" seguido del token.
- Extrae el token con un grupo de captura del regex.
- Busca el usuario con ese token y lo asigna a Current.user.
- Si no hay usuario válido, hace render con error y status unauthorized.
Ejemplo en Ruby:
# En PostsController
before_action :authenticate_user!, only: [:create, :update]
private
def authenticate_user!
auth = request.headers['Authorization']
regex = /\Abitter\s+(.+)\z/
if auth && (m = auth.match(regex))
token = m[1]
if user = User.find_by_auth_token(token)
Current.user = user
return
end
end
render json: { error: 'Unauthorized' }, status: :unauthorized
end
¿Cómo se valida el header Authorization con regex?
- Se define un regex con un grupo de captura: bitter seguido del token.
- El grupo de captura se indica con paréntesis.
- Con match data:
m[0]es el string completo;m[1]es el token.
Ejemplo rápido en consola de Rails:
t = 'bitter 123token'; regex = /\Abitter\s+(.+)\z/; m = t.match(regex); m[0]; m[1]
Claves prácticas:
- Usa asignación dentro del if: if user = User.find_by_auth_token(token).
- En Ruby, nil es falsy y cualquier otro objeto es truthy.
- Si no hay match o usuario, responde con status: :unauthorized y error "Unauthorized".
¿Cómo extraer el token y resolver el usuario?
La extracción del token depende de un grupo de captura en el regex. Con m = auth.match(regex), m[1] contiene el valor del token. Luego, se resuelve el usuario con User.find_by_auth_token(token).
¿Cómo funciona truthy/falsy en el if de asignación?
if user = User.find_by_auth_token(token)asigna y evalúa.- Si hay usuario: entra al if y continúa el flujo normal.
- Si no hay usuario (es nil): se salta el if y se hace render unauthorized.
¿Qué devuelve el controlador si falla la autenticación?
- Un JSON con el error.
- Un status unauthorized.
Ejemplo:
render json: { error: 'Unauthorized' }, status: :unauthorized
¿Cómo compartir current.user en toda la solicitud?
Para acceder al usuario autenticado en diferentes partes, se usa Current, basado en current attributes de Rails 5. Esto guarda el contexto de la sesión actual y lo hace accesible en controladores y modelos.
¿Cómo definir y usar Current en Rails 5?
- Se crea la clase Current que hereda de ActiveSupport::CurrentAttributes.
- Se declara el atributo user.
- Se asigna en authenticate_user!:
Current.user = user.
Código:
# app/models/current.rb
class Current < ActiveSupport::CurrentAttributes
attribute :user
end
Luego se puede usar Current.user en cualquier punto del ciclo de vida del request.
¿Qué reglas aplicar en show para posts públicos y borrador?
- Permitir ver posts públicos sin autenticación.
- Permitir ver borradores solo si el usuario está autenticado y es el dueño del post.
- Si no cumple, responder con unauthorized.
Sugerencia de implementación en show:
# Regla: permitir posts públicos; si es borrador, solo si pertenece al usuario autenticado.
# En caso contrario, responder unauthorized.
Ideas clave a retener:
- before_action con only: [:create, :update] para rutas sensibles.
- Header Authorization con formato "bitter m[0] para el match completo y m[1] para el token.
- If con asignación y semántica truthy/falsy de Ruby para flujos claros.
- render con error y status unauthorized cuando no hay autenticación.
- Current.user con current attributes para compartir el contexto del usuario.
¿Te gustaría ver un ejemplo completo integrando create, update y la regla de show con Current.user? Cuéntame en qué parte quieres profundizar o pega tu controlador para revisarlo juntos.