Cursos / Informática para Internet / Plataformas de aplicações Web / Aula

arrow_back Aula 11 - PetTopStore - Admin - Parte 3 (API)

API - Middleware requireJWT

O sistema Admin já tem um middleware chamado "requireAuth" criado anteriormente e responsável por restringir acesso às partes do sistema onde o administrador precisa está logado. Vamos criar um arquivo em "middlewares/requireJWT.js" com uma proposta similar, porém para ser utilizada nas rotas da API.

Os tokens JWT devem ser enviados em um atributo do header da requisições chamado "Authorization" e com o valor no formato: "Bearer TOKEN_JWT_AQUI". Repare que existe a palavra "Bearer" antes, seguida de um espaço e depois o token JWT. É assim que o valor do cabeçalho Authorization deve ser enviado nas requisições à API pelas aplicaçĩes.

O conteúdo do "middlewares/requireJWT.js" é:

const jwt = require('jsonwebtoken');
const segredoJWT = 'frase segredo para critografia do jwt';

module.exports = async (req, res, next) => {
  // verifica se a sessão está vazia (deslogado)
  if (!req.headers.authorization) {
    return res.status(401).json({
      message: 'Não autorizado'
    });
  }

  try {
    const token = req.headers.authorization.split(' ')[1];
    const decodedJWT = jwt.verify(token, segredoJWT);
    res.locals.jwt = decodedJWT;
    next();
  } catch (error) {
    return res.status(401).json({
      message: 'Token inválido'
    });
  }
}

O middleware requireJWT.js, como visto no código acima, realiza algumas verificações. A primeira é se o header authorization foi enviado, caso contrário ele retorna um json com status 401 e mensagem "Não autorizado".

Em seguida ele tenta remover o token do header authorization (que tem o "Bearer " antes) com o comando:

const token = req.headers.authorization.split(' ')[1];

Esse comando pega somente a segunda parte do authorization header, que é justamente o token JWT (ainda codificado).

Em seguida ele tenta decodificar o token com o segredo armazenado em uma variável. Esse token JWT decodificado na variável "decodedJWT" é então colocado em res.locals.jwt para que as requisições que dependem desse middleware tenha acesso aos dados presentes dentro do token de forma fácil e já decodificada. Os comandos para isso foram:

const decodedJWT = jwt.verify(token, segredoJWT);
res.locals.jwt = decodedJWT;

Repare que a biblioteca jsonwebtoken é usada aqui com o método jwt.verify que recebe o token codificado, o segredo e retorna o token decodificado (se o segredo estiver correto). Caso o segredo esteja incorreto, uma exceção de erro será disparada e capturada pelo catch.


Versão 5.3 - Todos os Direitos reservados