API privada en Rails: autenticar con token

Alejandro Alvarez
Academia Hack
Published in
2 min readJul 19, 2019
Photo by Khadija Yousaf on Unsplash

Los servicios web de acceso publico son geniales, no importa quien lo solicite, obtiene el mismo servicio que todos, los buscadores web o paginas de noticias son un buen ejemplo.

Pero no todos los servicios deberían ser públicos y de total acceso, sitios web bancarios o apps de mensajería instantánea, contienen información privada, de modo que se limita el acceso a la información que puede tener un usuario, para ello se recurre a autenticar a dicho usuario con un token.

Antes de meternos en estos conceptos primero construyamos un proyecto base y con estos endpoints

creamos nuestro proyecto

rails new private_api --api

luego creamos el modelo User

rails g model user email password_digest
rails db:migrate

agregamos a nuestro Gemfile las gema bcrypt

gem 'bcrypt'
gem 'jwt'

Esta gema nos facilita la encriptación de la contraseña de nuestros usuarios y la guarda en el atributo password_digest , aunque nosotros lo guardemos como password, para terminar con el modelo agregamos validaciones básicas y has_secure_password que es lo que hace que la magia de la contraseña ocurra. Así quedaría nuestro modelo

Ahora que nuestro modelo esta listo, vayamos a crear nuestro controlador de usuarios

rails g controller users

Tenemos nuestro controlador con index y create , ademas vemos el skip_before_action authenticate! pero no esta definido en este controlador, vayamos al application_controller y agregamos

Con esto estamos autenticando todos nuestras acciones en la aplicación, si vemos el método authenticate! observamos que pedimos algo en el header, un atributo llamado Authorization que luego usamos para generar un token, un token es como una llave o un código secreto que se le otorga al usuario una vez haga “login” y este identifica al usuario.

Ahora debemos crear nuestro generador de tokens, para ello, personalmente me gusta crear una carpeta dentro de app llamada concepts , y dentro colocar nuestro generador de tokens app/concepts/json_web_token.rb

No solo nos sirve para generar el token si que también nos sirve para tomar el token y convertirlo en lo que era antes, que en nuestro caso es el id del usuario

Ya solo estamos a dos pasos de culminar nuestro pequeño proyecto y lo que nos hace falta es crear otro controlador pero este sera para hacer login

rails g controller auth

La acción create de este controlador toma el email y el password de un usuario y si hacen match devuelve el token.

El token debe ser enviado en el header bajo la llave “Authorization” para tener acceso a las rutas privadas de nuestra aplicación.

Por ultimo debemos configurar nuestras rutas

Estamos listos!!!

Creamos dos rutas publicas, una para generar un usuario y otra para autenticarlo, ademas que una ruta privada para listar todos los usuarios, podemos probar nuestras rutas con postman y experimentar un poco culminando el crud de usuarios agregando las rutas privadas “show/update/destroy” a users.

--

--