Autenticação JWT no Django

Este tutorial dará uma introdução ao JSON Web Tokens (JWT) e como implementar a autenticação JWT no Django.

O que é JWT?

JWT é uma string JSON codificada que é transmitida em cabeçalhos para autenticar solicitações. Geralmente é obtido por hash de dados JSON com uma chave secreta. Isso significa que o servidor não precisa consultar o banco de dados todas as vezes para recuperar o usuário associado a um determinado token.

Como funcionam os tokens da Web JSON

Quando um usuário faz login com sucesso usando suas credenciais, um JSON Web Token é obtido e salvo no armazenamento local. Sempre que o usuário deseja acessar uma URL protegida, o token é enviado no cabeçalho da requisição. O servidor então verifica se há um JWT válido no cabeçalho de autorização e, se encontrado, o acesso do usuário será permitido.

Um cabeçalho de conteúdo típico terá esta aparência:

Authorization:
Bearer eyJhbGciOiJIUzI1NiIsI

Abaixo está um diagrama que mostra esse processo:

Como funcionam os tokens da Web JSONComo funcionam os tokens da Web JSONComo funcionam os tokens da Web JSON

O conceito de autenticação e autorização

A autenticação é o processo de identificação de um usuário logado, enquanto a autorização é o processo de identificação se um determinado usuário tem o direito de acessar um recurso da web.

Exemplo de API

Neste tutorial, vamos construir um sistema simples de autenticação de usuário no Django JWT como mecanismo de autenticação.

Requisitos

Vamos começar.

Crie um diretório onde você manterá seu projeto e também um ambiente virtual para instalar as dependências do projeto.

Ative o ambiente virtual:

Crie um projeto Django.

Instale DRF e django-rest-framework-jwt usando pip.

Vamos adicionar o DRF à lista de aplicativos instalados no settings.py Arquivo.

Defina as configurações do JWT

Para usar um JWT simples, precisamos configurar as permissões django-rest-framework para aceitar JSON Web Tokens.

No settings.py arquivo, adicione as seguintes configurações:

Crie um novo aplicativo chamado users, que lidará com a autenticação e o gerenciamento do usuário.

Adicione o aplicativo de usuários à lista de aplicativos instalados no settings.py Arquivo.

Configurando o banco de dados

Vamos usar o banco de dados PostgreSQL porque é mais estável e robusto.

Crie o auth banco de dados e atribuir um usuário.

Mude para a conta Postgres em sua máquina digitando:

Acesse o prompt do Postgres e crie o banco de dados:

Crie uma função:

Conceda acesso ao banco de dados ao usuário:

Instale o pacote psycopg2, que nos permitirá usar o banco de dados que configuramos:

Edite o banco de dados SQLite atualmente configurado e use o banco de dados Postgres.

Criando modelos

O Django vem com um sistema de autenticação embutido que é muito elaborado, mas às vezes precisamos fazer ajustes e, portanto, precisamos criar um sistema de autenticação de usuário personalizado. Nosso modelo de usuário será herdado do AbstractBaseUser classe fornecida por django.contrib.auth.models.

Em users/models.py, começamos criando o modelo User para armazenar os detalhes do usuário.

REQUIRED_FIELDS contém todos os campos obrigatórios em seu modelo de usuário, exceto o campo de nome de usuário e senha, pois esses campos sempre serão solicitados.

UserManager é a classe que define o create_user e createsuperuser métodos. Esta classe deve vir antes do AbstractBaseUser classe que definimos acima. Vamos em frente e defini-lo.

Migrações

As migrações fornecem uma maneira de atualizar seu esquema de banco de dados sempre que seus modelos mudam, sem perder dados.

Crie uma migração inicial para nosso modelo de usuários e sincronize o banco de dados pela primeira vez.

Criando um Superusuário

Crie um superusuário executando o seguinte comando:

Criando novos usuários

Vamos criar um endpoint para habilitar o cadastro de novos usuários. Começaremos serializando os campos do modelo do usuário. Os serializadores fornecem uma maneira de alterar os dados para um formato mais fácil de entender, como JSON ou XML. A desserialização faz o oposto, que é converter dados em um formulário que pode ser salvo no banco de dados.

Crie users/serializers.py e adicione o seguinte código.

CreateUserAPIView

Em seguida, queremos criar uma visualização para que o cliente tenha uma URL para criar novos usuários.

Em users.views.py, adicione o seguinte:

Montamos permission_classes para (AllowAny,) para permitir que qualquer usuário (autenticado ou não) acesse esta URL.

Configurando URLs

Criar um arquivo users/urls.py e adicione o URL para corresponder à exibição que criamos. Adicione também o seguinte código.

Também precisamos importar URLs do aplicativo de usuários para o principal django_auth/urls.py Arquivo. Então vá em frente e faça isso. estamos usando o include função aqui, então não se esqueça de importá-lo.

Agora que terminamos de criar o endpoint, vamos fazer um teste e ver se estamos no caminho certo. Usaremos o Postman para fazer os testes. Se você não estiver familiarizado com o Postman, é uma ferramenta que apresenta uma GUI amigável para construir solicitações e ler respostas.

Configurando URLsConfigurando URLsConfigurando URLs

Como você pode ver acima, o endpoint está funcionando conforme o esperado.

Autenticação de usuários

Faremos uso do módulo Django-REST Framework JWT Python que instalamos no início deste tutorial. Ele adiciona um suporte de autenticação JWT simples para aplicativos Django Rest Framework JWT.

Mas primeiro, vamos definir alguns parâmetros de configuração para nossos tokens e como eles são gerados no arquivo settings.py.

  • JWT_VERIFY: Ele gerará um jwt.DecodeError se o segredo estiver errado.
  • JWT_VERIFY_EXPIRATION: define a expiração como True, o que significa que os Tokens expirarão após um período de tempo. O tempo padrão é cinco minutos.
  • JWT_AUTH_HEADER_PREFIX: o prefixo do valor do cabeçalho de autorização que deve ser enviado junto com o token. Nós o configuramos como Bearere o padrão é JWT.

Dentro users/views.pyadicione o seguinte código.

No código acima, a visualização de login usa o nome de usuário e a senha como entrada e, em seguida, cria um token com as informações do usuário correspondentes às credenciais passadas como carga útil e o retorna ao navegador. Outros detalhes do usuário, como nome, também são retornados ao navegador junto com o token. Este token será usado para autenticação em solicitações futuras.

As classes de permissão são definidas como allowAny já que qualquer um pode acessar este endpoint.

Também armazenamos a hora do último login do usuário com este código.

Toda vez que o usuário deseja fazer uma solicitação de API, ele deve enviar o token em Auth Headers para autenticar a solicitação.

Vamos testar esse endpoint com o Postman. Abra o Postman e use a solicitação para autenticar com um dos usuários que você criou anteriormente. Se a tentativa de login for bem-sucedida, a resposta será semelhante a esta:

Uma amostra de respostaUma amostra de respostaUma amostra de resposta

Recuperando e Atualizando Usuários

Até agora, os usuários podem se registrar e se autenticar. No entanto, eles também precisam de uma maneira de recuperar e atualizar suas informações. Vamos implementar isso.

Dentro users.views.pyadicione o seguinte código.

Primeiro definimos as classes de permissão e definimos como IsAuthenticated já que esta é uma URL protegida e somente usuários autenticados podem acessá-la.

Definimos então um get método para recuperar detalhes do usuário. Depois de recuperar os detalhes do usuário, um usuário autenticado atualizará seus detalhes conforme desejado.

Atualize suas URLs para definir o terminal da seguinte maneira.

Para que a solicitação seja bem-sucedida, os cabeçalhos devem conter o token JWT conforme mostrado abaixo.

Cabeçalhos com o token JWTCabeçalhos com o token JWTCabeçalhos com o token JWT

Se você tentar solicitar um recurso sem o cabeçalho de autenticação, receberá o seguinte erro.

Um exemplo de erroUm exemplo de erroUm exemplo de erro

Se um usuário permanecer além do tempo especificado em JWT_EXPIRATION_DELTA sem fazer uma solicitação, o token expirará e eles terão que solicitar outro token. Isso também é demonstrado a seguir.

Exemplo de JWT_EXPIRATION_DELTAExemplo de JWT_EXPIRATION_DELTAExemplo de JWT_EXPIRATION_DELTA

Conclusão

Este tutorial abordou o que é necessário para criar com sucesso um sistema sólido de autenticação de back-end com JSON Web Tokens. Também cobrimos a autenticação Django JWT ou a autorização Django.

Confira mais artigos e tutoriais Python e Django JWT:

Deixe uma resposta