Hay varias formas de crear una capa de autenticación en las aplicaciones web pero hoy nos vamos a centrar en la Autenticación Basada en Token o Token Based Authentication por varias razones:
Autenticación significa ser capaz de identificar quién está haciendo peticiones a tu API; Normalmente implementas una capa de autenticación en tu aplicación porque quieres:
Para explicar en detalle la "Autenticación de una API basada en tokens" es mejor empezar explicando lo que son los tokens.
A grandes rasgos, un token es un "número que prueba algo", por ejemplo: Cuando terminas de hacer una transferencia bancaria, el banco envía un "token" de confirmación que sirve como prueba para validar que la transacción existe y es válida. Ese número de confirmación podría llamarse también token de confirmación`.
Otros ejemplos de tokens cotidianos:
Los tokens utilizados para la autenticación tienen que ser algo más que números normales, tienen que ser casi imposibles de falsificar, predecir o decodificar.
Hay varios tipos de tokens que puedes usar para tu sistema de autenticación como Basic, Bearer, o JWT. La mayoría de ellos utilizan algoritmos de criptografía avanzada que no vamos a tratar en esta lección (puedes ver este increíble vídeo para aprender más). En su lugar, vamos a hablar de hash.
Un hash es un número alfanumérico único que se genera a partir de una semilla o valor específico, por ejemplo:
1import hash_function 2 3value = "alex" 4unique_hash = hash_function(value)
Explicación: la función hash_function
siempre devolverá exactamente el mismo unique_hash
si se da el mismo valor, echa un vistazo a esta demostración, empieza a escribir en la entrada:
Nota: Hay varias funciones de hashing populares: MD5, Sha1, Sha256, Sha256, etc.
Las funciones hashing se han convertido en la mejor forma de generar tokens en el mundo de la seguridad porque
Nota: Cada dirección de billetera bitcoin tiene un hash único, cada commit que haces en github tiene un hash único, etc.
La forma más sencilla de implementar la autenticación en tu base de datos y en tu API:
User
que represente a cada usuario dentro de tu aplicación.POST /token
que genere un token sólo si recibe un email y una contraseña que se encuentren en la base de datos.POST /token
devolverá el token al front-end si todo está bien.En el momento en que generas el token puedes decidir si quieres que caduque, de la misma manera que las sesiones web caducan cuando te conectas a tu cuenta bancaria online.
Cuando un cliente se autentique con éxito recibirá ese token único y podrá adjuntarlo a los headers de las peticiones que realice a partir de ese momento, ese token será la "sesión del usuario".
Se recomienda guardar ese token en las cookies o localStorage de tu aplicación front-end.
1let myToken = "aDSA45F$%!sd&sdfSDFSDFytrefERF"; 2localStorage.setItem("token", myToken); 3 4 5Puedes recuperar el token en cualquier momento, en cualquier lugar de tu aplicación utilizando: 6let myToken = localStorage.getItem("token);
Si estás haciendo una petición desde el Front-End esta será una forma ideal de adjuntar el token a tus Authorization headers:
1let myToken = localStorage.getItem("token); 2fetch('https://myApi.com/path/to/endpoint', { 3 method: "POST", //o cualquier otro método 4 headers: { 5 "Authorization": myToken, // ⬅⬅⬅ authorization header 6 }, 7 body: JSON.stringify(body) 8}) 9 .then(resp => resp.json()) 10 .then(data => console.log("Success!!", data)) 11 .catch(error => console.log(error)); 12
Recomiendo encarecidamente el uso de Flask JWT Extended.