Autenticación y Autorización en Ruby on Rails

Ivonne C
TechWo
Published in
4 min readAug 8, 2017
Autenticación y autorización, dos elementos críticos en el desarrollo de APIs

Cuando estamos trabajando con una API, una de las primeras propiedades que debemos implementar es el manejo de los usuarios. Necesitamos analizar como es que éstos se relacionarán con el sistema para poder decidir el tipo de autenticación y autorización que vamos a integrar.

Para empezar, debemos tener en claro la diferencia de estos conceptos y en seguida ver las necesidades y usos del API para poder elegir la mejor implementación tanto de autenticación como de autorización. Es importante recalcar, que no siempre vamos a necesitar de las dos soluciones.

Autenticación

Autenticación: control de accesos de los usuarios

Este término es usado para englobar todo lo que se refiere al control de acceso de los usuarios. Maneja las siguientes funciones, entre otras:

  • Registro de usuarios.
  • Manejo de contraseñas: confirmación, restablecer, recordar, validación.
  • Confirmación de usuarios por correo electrónico.
  • Validación de usuario.
  • Creación de token de un usuario validado.
  • Rastreo de usuario (conteo de logins de un username o dirección IP en un tiempo determinado).
  • Expiración de sesión.
  • Blockeo de usuarios.

Una de las librerías más versátiles de autenticación para Ruby on Rails es devise, una vez teniendo los conceptos de autenticación claros, la curva de aprendizaje es corta. Una de las recomendaciones de los mismos creadores de devise, es que no uses esta librería si no has implementado antes autenticación antes así te recomiendo que hagas una prueba con este tutorial y en seguida te puedes lanzar a devise sin problemas. Te puedes apoyar entonces en tutoriales de RailsCast, este es una introducción a la librería y este es para aprender a personalizarla.

Si te ves en la necesidad de implementar tu autenticación, recuerda la regla de oro: jamás debes crear tu propio algoritmo de encriptación, y debes usar uno hecho por gente con doctorados en el área. En otras palabras, usa BCrypt.

Un dato importante, solo usa los módulos que realmente necesita tu API para que no sea innecesariamente complicada. A medida que tu sistema crezca, puedes añadir más funcionalidades sin tener que hacer grandes cambios de código.

Autorización

Autorización: Lo que un usuario puede hacer dentro del sistema

Una vez que un usuario tiene acceso al sistema, hay que ver los permisos que este usuario tiene en cada request que se le hace a nuestro servicio.

Para elegir la implementación de autorización es necesario ver los casos de uso de cada tipo de usuario.

Si la mayoría de los casos se enfoca en como un usuario puede o no puede interactuar con un objeto, entonces estamos hablando de un sistema basado en recursos. Cada usuario tiene asignado un rol, y cada rol tiene asignado una serie de permisos para crear, leer o actualizar un objeto. Por ejemplo, en un sistema donde tenemos usuarios y blogs, un administrador puede llamar todos los CRUD endpoints tanto de usuarios como de blogs, mientras que un lector solo puede leer blogs. Para este tipo de sistemas te recomiendo CanCanCan una librería de Rails, sencilla de usar donde en un solo archivo se definen las reglas de cada rol de usuario.

Por otro lado, si cada caso se refiere más a un conjunto de reglas para determinar si un usuario puede o no hacer algo con un objeto, diremos que la autorización está basada en políticas o reglas. Pensemos en un sistema de reclutamiento, el CEO tiene acceso a ver a todos los candidatos, una persona de RH puede manejar solo gente que ha aplicado a sus posiciones de trabajo, mientras que un entrevistador solo puede ver gente que ha aplicado a posiciones de su proyecto y actualizar gente que ha entrevistado. Como puedes ver, cada usuario tiene un rol, pero dos usuarios que compartan el mismo rol pueden tener diferentes permisos hacia un objeto y las reglas que lo determinan pueden ser simples o muy complejas.

Para sistemas de este tipo te recomiendo Pundit, una librería que te permite definir las reglas por modelo, si utilizas CanCanCan aunque sea más sencilla de usar, pronto tu archivo de permisos se volverá muy difícil de mantener.

Conclusión

Una vez que tengas claro los conceptos de autenticación y autorización podrás perderle el miedo a estos dos elementos que suelen ser críticos en cualquier API que luego solemos ignorarlos y dejarlos para que alguien más se anime. No tienes que implementar todo desde cero, aún cuando las necesidades de tu sistema te orillen a crear tu propia autenticación o autorización, apóyate en librerías que harán tu trabajo más disfrutable. Y recuerda, empieza de a poco, con los casos de uso que conozcas, y a medida que lo necesites entonces incorpora más funcionalidad.

Fuente

http://buddylindsey.com/ror-week-5-authentication-or-authorization/

--

--

Ivonne C
TechWo
Editor for

Software Engineer, backend developer, business anaylist, drupalist, devops junior, and now business intelligence architect.