API privada en Rails: autenticar con token
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.