Authentication API

Authentication API

como funciona a autenticação em uma API

Authentication é como chamamos os métodos de autenticação dentro de uma aplicação, já estamos acostumados com a tela de usuário e senha padrão que vemos em todo e qualquer tipo de sistema, mas como ela de fato funciona?

Neste artigo estarei falando sobre Basic Authentication e JWT Authentication / Authorization

Basic Authentication

é um esquema utilizado ainda no método HTTP onde as credenciais do cliente são codificadas mas não encriptadas.

Através do envio das credencias do cliente dentro do Header fazemos a Autenticação assim permitindo o continuo da requisição da rota ou recurso porém apenas naquela conexão, assim que outra conexão for estabelecida o cliente terá que colocar suas credenciais novamente.

Sua sintaxe fica desta forma

Authentication : Basic user:password

o usuário e senha são enviados no campo Authentication codificados com base64 , esses dados permanecem acessíveis pelo header das requisições e são de fácil decodificação, sendo assim sempre que formos utilizar do método Basic Authentication devemos faze-lo utilizando outras ferramentas que garantem a segurança como HTTPS e SSL

image.png

Mais detalhes

  • Não prove um método dentro do servidor para que o cliente possa se deslogar
  • Caso não aceito retorna o erro 401 ( Unauthorized )

JWT ( JSON Web Token )

JWT ou JSON Web Token é um padrão de transferência de informações já consolidado como o padrão dos dias atuais, ele define formas compactas e seguras de realizar o transporte de informações sensíveis de um dispositivo a outro utilizando JSON object.

Signed Tokens
Quando um Token é assinado é possível verificar a integridade dos atributos que ele contém, by the way Token Encriptados escondem estes atributos para outras partes.

  • Quando um token é assinado podemos tanto autenticar o requisitante certificando-se de que ele é quem diz que ele é, quanto verificar a integridade da mensagem enviada assim tendo certeza de que o objeto não foi alterado durante o envio.

  • Normalmente os tokens são assinados através de uma public/private key sendo assim a private key | a chave que fica do lado do cliente ( faz a assinatura do token ) e a public key | a chave que fica do lado do ouvinte ( faz a verificação da chave )

  • Desta forma temos certeza de que apenas o lado que possui a private key faz a assinatura do token.

Quando devemos usar o JSON Web Token?

Authentication

Assim que o cliente estiver logado ele receberá um JWT que irá servir como uma identificação temporária e será enviado ao servidor em todas as requisições seguintes, o qual dará a ele acesso a rotas, recursos e funcionalidades dentro do sistema.

Troca de Informações

O JWT pode ser uma boa forma de transferência de informação, por exemplo através das private/public key podemos nos certificar de que o cliente é realmente quem ele diz ser.

  • Além da assinatura ser uma mistura entre header e payload garantindo assim a não adulteração de conteúdo dentro do objeto enviado.

Como é a Estrutura de um JSON Web Token?

image.png

Divido em 3 partes que mais futuramente farão parte de uma única e longa String com a seguinte sintaxe.

header.payload.signature

Header

O header é formado por 2 campos normalmente o tipo do token e a assinatura do algoritmo em que o payload será encriptado.

Payload

O payload é formado por claims ( atributos ) e podem haver 3 tipos de claims registered, public e private.

Registered Claim
Não é obrigatória mas é recomendada, são claims para prover um mais tipo de detalhe a aplicação. como tempo de expiração , assunto e etc.

Public Claim
São Claims que podem ser definidas a vontade, mas para evitar conflitos elas devem ser definidas no IANA JSON Web Token Registry ou ser definida como URI que contem um campo de nome resistente a colisões.

Private Claim
Claims customizadas criadas para transportar informações para duas partes que concordaram em utiliza-las.

Mais detalhes

  • As claims são de feitas de atributos com chaves não maiores que 3 caracteres exatamente para serem leves.
  • Importante não colocar informações sensíveis dentro de claims pois elas são de acesso publico.

Signature

Para criar a assinatura do método o que precisamos é do header + payload ( os dois já codificados ) + secret ( normalmente a private key ) e o resultado em texto nos encriptamos de acordo com o algoritmo declarado no header.

image.png

  • A assinatura é usada para verificar se a mensagem não foi modificada no meio do caminho e no caso de token assinado com chave privada verifica se o client é quem ele diz ser.

Juntando as partes obtemos um resultado semelhante a este.

image.png

Caso se interesse em aprender e praticar um pouco mais entre no link abaixo
jwt.io

Como Funciona o JSON Web Token?

Assim que o usuário faz login com suas credenciais ele recebe um JWT que é armazenado pelo navegador de diversas formas , sempre que o usuário fizer novas requisições deverá enviar junto as requisições o JWT no campo Authorization do header com o esquema Bearer seguindo a seguinte sintaxe.

"Authorization" : Bearer stringToken

  • Se o token é enviado no campo Authorization do header então Cross-Origin Resource Sharing ( CORS ) não será um problema como ele não utiliza cookies.

image.png

  • A aplicação ( cliente ) requisita a autorização para o server de authentication; pode ser realizado por meio de diversos fluxos.

  • O servidor garante a authorization e envio de volta para o cliente um token de acesso assinado.

  • O cliente agora pode utilizar de rotas e recursos utilizando o token que prova sua identidade e autorização dentro da API.

Como Funciona a Assinatura?

como sabemos temos 2 tipos de chaves

  • chave privada
  • chave publica

Para assinar o token

  • A chave privada fica pertencente ao cliente e é usada para calcular a assinatura.

  • A chave publica fica pertencente as partes que utilizam do token e é utilizada para verificar a integridade do token.

image.png


  • Não acabou ainda...

OAuth 2.0, que significa "Autorização Aberta", é um padrão projetado para permitir que um site ou aplicativo acesse recursos hospedados por outros aplicativos web em nome de um usuário, isso nos permite maior acoplamento de autenticações podendo assim realizar o login do git hub como por exemplo pelo google, mas isso é um padrão que fica para outro artigo.