A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Firmar y verificar tokens

9/20
Recursos

Aportes 5

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Para los refresh tokens hay que definir un tiempo de expiraci贸n, eso se puede lograr pasando un tercer argumento de configuraci贸n a la funci贸n sign.

Para hacer que expire el token despu茅s de un cierto tiempo ser铆a:

const jwt = require('jsonwebtoken')

const jwtConfig = {
  expiresIn: '7d',
};
const payload = {
  sub: user.id,
  role: "customer"
}

const token = jwt.sign(payload, process.env.JWTSECRET, jwtConfig)

Observaciones:

  • user es la instancia del usuario obtenido del modelo que tenga la propiedad Id del usuario.
  • Se utiliza sub por conveniencia porque as铆 lo maneja el standar de JWT pero puede usarse el nombre que uno quiera mas info sobre los claims disponibles aqu铆

si en expiresIn se pone s贸lo n煤mero entonces lo considera en segundo, pero si es un string entonces deber谩 llevar la unidad para definir el tiempo de expiraci贸n, ejemplo:

60 * 60 === '1h鈥
60 * 60 * 24 === 鈥1d鈥

pero si por accidente se pone un string sin unidad de tiempo entonces lo tomar谩 como milisegundos:
鈥60鈥 === 鈥60ms鈥

Javascript Web Tockens:

Allows to create continuous and secure connections in server-client

  • Brief introduction of JWT
    • Install:

      npm install jsonwebtoken

    • Signing tokens

      To sign, create an env var or any secure variable to store a secret, which will allow you access to token information

      Example:

      const secret = 'Run';

      Then create payload, it contains all information you want to send

      const payload = {
          sub: 1,
          role: 'customer',
      };
      
      

      Finally, use token functions to sign it:

      //First argument is payload and second is secret key
      const token = jtw.sign(payload, secret);
      console.log(token);
      
    • Verify tokens

      const jwt = require('jsonwebtoken');
      
      const secret = 'Runrun';
      const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEsInJvbGUiOiJjdXN0b21lciIsImlhdCI6MTYzNTQ0ODU0MX0.xnUAX-1jN2Gnp25LbYw7q0ezmm4Ya-T0FAZ7ePe7thg'
      
      const payload = jwt.verify(token, secret);
      console.log(payload);
      

Uh muy buena data no conocia los refresh tokens!

Como sabe el servidor que un JWT fue alterado?

La base es esa 鈥淧ALABRA_SECRETA鈥. El campo de Signature es el resultado de los campos del Header, deL Payload y de la 鈥淧ALABRA_SECRETA鈥 sumados.

Si el Payload cambia, el resultado cambia y se crea un JWT invalido, para que ese cambio sea valido tiene que ser generado con nuestra 鈥淧ALABRA_SECRETA鈥, pero como el cliente no sabe esa palabra secreta no puede crear un JWT modificado valido.

Por eso es tan importante que esa 鈥淧ALABRA_SECRETA鈥 se sea lo mas compleja y grande que se pueda y se mantega segura.

Las maravillas de la criptografia.

Existen librer铆as para firmar (generar) y verificar un token, en el sitio oficial de JWT recomienda algunas. En este caso se usar谩 jsonwebtoken instal谩ndola con el comando npm install jsonwebtoken.


Para firmar un token se crea la siguiente estructura (archivo token-sign.js):

const jwt = require('jsonwebtoken');

const secret = 'myCat';
const payload = {
  sub: 1,
  role: 'customer',
};

function signToken(payload, secret) {
  return jwt.sign(payload, secret);
}

const token = signToken(payload, secret);
console.log(token); // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEsInJvbGUiOiJjdXN0b21lciIsImlhdCI6MTY0Mzk0NDgxM30.Z3MKuevzXLt0bixve06-Awn3OWYsqxU61NYtLrYq2Zg

La llave secreta (secret) debe estar en el lado del backend por una variable de ambiente, no debe estar en el c贸digo, ni en el frontend.

El payload es lo que se va a encriptar con el token, sub (subject) es la forma en la que se va a identificar el usuario. El scope a veces se utiliza para los permisos, se puede agregar m谩s cosas, por ejemplo role.

A la funci贸n signToken se le env铆a el payload y el secret, y con la librer铆a jwt se ejecuta la funci贸n .sign() enviando el payload y secret. Con ello, ya se estar铆a firmando un token.


Para verificar un token se requiere el token y el secret, a la funci贸n verifyToken se le env铆a el token y el secret, y con la librer铆a jwt se ejecuta la funci贸n .verify() enviando el token y secret. Con ello, ya se estar铆a verificando un token.

const jwt = require('jsonwebtoken');

const secret = 'myCat';
const token =
  'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEsInJvbGUiOiJjdXN0b21lciIsImlhdCI6MTY0Mzk0NDgxM30.Z3MKuevzXLt0bixve06-Awn3OWYsqxU61NYtLrYq2Zg';

function verifyToken(token, secret) {
  return jwt.verify(token, secret);
}

const payload = verifyToken(token, secret);
console.log(payload); // { sub: 1, role: 'customer', iat: 1643944813 }

Cualquier persona que tenga el token puede ver la informaci贸n que viaja en el payload, por esa raz贸n no se recomienda guardar informaci贸n sensible (email, password, servicio, key, etc.).

Bajo ninguna circunstancia se puede modificar el token, a menos que se cuente con el secret. Una forma eficiente de manejar el token cuando se conecta al cliente es a trav茅s del refresh token el cual tiene una fecha de expiraci贸n, en este caso, el cliente detecta que el token expir贸 y genera un nuevo refresh token.