A Autenticação em sistemas computacionais consiste em confirmar a autenticidade de uma pessoa dentro de um determinado contexto e está relacionado diretamente à segurança do sistema verificando a permissão e os limites de acesso do usuário.

Há diversas formas de autenticação dentro de um sistema como por exemplo: os Smart Cards conhecidos como tokens, a biometria e a mais difundida e aceita que é o uso de senha.

Framework e Autenticação

Dentro do universo JavaScripts temos diversos frameworks e bibliotecas que utilizamos como ferramentas para desenvolvimento visando o uso das ferramentas Node.js e React.js, temos alguns frameworks que auxiliam no processo de criação dessas autenticações tais como o Passport.js, cujo download está estimado em mais de 905 mil segundo o site (openbase.io/packages/top-nodejs-authentication-libraries).

Passport.js é um framework que utiliza a teoria de middlewares e dispõe de mais de 500 estratégias de autenticação, contando com as estratégias de autenticação através da conta do Facebook, Twitter, Google e muito mais, uma das estratégias mais usadas e que também está disponível é o JWT (JSON WEB Token).

Exemplo de Autenticação com Passport.js em uma estrutura já cirada:

routes.post('/login', async (request, response, next)=>{
    passport.authenticate(
      "login",
      async(err,user,info)=>{
          try {
              if(err || user){
                  const error = new Error('Erro ao autenticar usuário');
                  return next(error);
              }

              request.login(user, {session:false}, async (err)=>{
                  if(err) return next(err);
                    const body = {id:user.id, email:user.email}

                    const token = jwt.sign({user: body}, 'top_secret');
                    
                    return response.json({ token });
              })
          } catch (e) {
              retun next(e);
          }
      });
})

Explicando o JWT

O JWT consiste em métodos abertos e padrões da indústria que representam as solicitações entre as partes com segurança utilizando objeto JSON, permitindo a codificação e decodificação de informações através de assinaturas digital usando um segredo com o algoritmo HMAC(Hash-Based Message Authentication Code, é utilizado especificamente para calcular um MAC ) ou um par de chaves pública / privada usando RSA ou ECDSA.

A estrutura do JWT consiste em:

  • Cabeçalho – formado por duas aparte: o tipo de token, que é JWT, e o algoritmo de assinatura usados, como HMAC SHA256 ou RSA.
  • Carga útil – As declarações são declarações sobre uma entidade (normalmente, o usuário) e dados adicionais. Existem três tipos de reivindicações: registradas, públicas e privadas.
    • Declarações registradas: trata-se de um conjunto de declarações predefinidas que não são obrigatórias, mas recomendadas, para fornecer um conjunto de declarações úteis e interoperáveis. Alguns deles são: iss (emissor), exp (prazo de validade), sub (assunto), aud (público) e outros.
    • Reivindicações públicas: podem ser definidas à vontade por aqueles que usam JWT. Mas, para evitar colisões, eles devem ser definidos no IANA JSON Web Token Registry ou como um URI que contém um namespace resistente a colisões.
    • Reivindicações privadas: são as reivindicações personalizadas criadas para compartilhar informações entre as partes que concordam em usá-las e não são reivindicações registradas ou públicas.
  • Assinatura – Para criar a parte da assinatura, você deve pegar o cabeçalho codificado, a carga útil codificada, um segredo, o algoritmo especificado no cabeçalho e assiná-lo.

Comparando o JWT

Em comparação do JWT com outras formas de autenticação, como o SWT (Simple Web Tokens) e o SAML (Security Assertion Markup Language Tokens), percebemos que o JSON ganha em tamanho e menor verbosidade tornando o JSON uma boa opção para transmissão de dados em HTML e HTTP.

  • SWT – somente pode ser assinado simetricamente por um segredo compartilhado usando o algoritmo HMAC.
  • SAML e o JWT – além do uso já mencionado também pode usar os pares de chaves pública / privada na forma de um certificado X.509 para assinatura.

Em comparativo do SAML que utiliza o XML nas suas estruturas e o JWT que utiliza JSON temos o JWT com a maior simplicidade e menor verbosidade dificultando a criação de brecha de segurança pela complexidade de estrutura, quanto aos analisadores JSON são comuns na maioria das linguagens de programação, mapeando diretamente para objetos já por outro lado, XML não possui um mapeamento natural de documento para objeto tornando mais simples e fácil trabalhar com JWT do que com asserções SAML.

Figura 1 – JWT utilizando o corpo JSON

VS

Referências

https://www.tecmundo.com.br/seguranca/1971-o-que-e-autenticacao-.htm

https://openbase.io/packages/top-nodejs-authentication-libraries

https://www.devmedia.com.br/como-o-jwt-funciona/40265

Autor: Alexandre de Oliveira