Domine inglês técnico de programação em 2025, seja qual for seu nível. Inscrição gratuita

Como implementar autenticação JWT em APIs Flask com Python
Rocketseat

Rocketseat

4 min de leitura
python
Faaala, dev! Você sabia que a programação não é apenas sobre escrever códigos, mas também sobre criar oportunidades e transformar vidas? Hoje, vamos mergulhar em um tema fundamental para qualquer desenvolvedor que deseja construir APIs seguras e robustas: autenticação JWT (JSON Web Token). Seja você um iniciante ou alguém buscando reforçar seus conhecimentos, este artigo vai te guiar por uma jornada prática e inspiradora. Bora codar?

O que é JWT e por que ele é tão importante?

Imagine que você está construindo uma aplicação web que precisa diferenciar entre usuários comuns e administradores. Mais do que isso, você quer garantir que só as pessoas certas acessem informações sensíveis. Aqui entra o JSON Web Token (JWT), um padrão que permite criar tokens seguros e criptografados para autenticar usuários em aplicações distribuídas.
O JWT funciona como um "passe digital". Ele carrega informações sobre o usuário (como permissões e identificação), de forma codificada e assinada, em três partes principais:
  • Header: contém o algoritmo usado na assinatura e o tipo do token.
  • Payload: inclui as informações (como e-mail ou ID do usuário).
  • Signature: garante a integridade do token, assegurando que ele não foi alterado.
Essa estrutura faz do JWT uma ferramenta poderosa, permitindo que as aplicações autentiquem usuários sem precisar armazenar as informações em um banco de dados a cada requisição. Legal, né?

Como funciona o JWT na prática?

Vamos ilustrar com uma situação prática: uma API que possui rotas protegidas, como /perfil ou /admin. Aqui está o que acontece:
  1. O usuário faz login, enviando suas credenciais.
  1. O servidor valida as informações e gera um token JWT contendo dados como:
      • Identificação do usuário.
      • Permissões.
      • Tempo de expiração.
  1. O token é retornado ao cliente e armazenado (normalmente no localStorage ou cookies).
  1. Nas próximas requisições, o cliente envia o token no cabeçalho HTTP.
  1. O servidor valida o token antes de permitir o acesso às rotas protegidas.
Esse fluxo torna o sistema eficiente e escalável, sem a necessidade de consultar um banco de dados em cada interação.

Mãos à obra: começando com JWT e Python

Chegou a hora de transformar teoria em prática! Não se preocupe se você é iniciante: vamos construir juntos uma API segura passo a passo, explicando cada detalhe. Preparado para criar uma aplicação que pode ser o pontapé inicial de muitos projetos incríveis? Bora codar!

Preparando o terreno: configurando o ambiente

Antes de começar, precisamos preparar nosso ambiente de desenvolvimento. Isso ajuda a organizar os arquivos e bibliotecas que vamos usar. Vamos lá!
  1. Abra seu terminal e crie um ambiente virtual para o projeto:
    1. python3 -m venv venv
      Isso cria um "espaço isolado" onde você pode instalar dependências sem bagunçar o restante do seu sistema.
  1. Ative o ambiente virtual:
      • Windows:
        • venv\Scripts\activate
      • Linux/Mac:
        • source venv/bin/activate
  1. Instale as bibliotecas necessárias:
    1. pip install flask pyjwt
      • Flask: é o framework que usaremos para criar nossa API.
      • PyJWT: será o herói responsável por criar e validar nossos tokens JWT.

Criando a API básica

Comece criando um arquivo chamado app.py. Nele, vamos configurar o básico para nossa aplicação:
from flask import Flask, jsonify app = Flask(__name__) # Rota inicial (hello world) @app.route("/") def home(): return jsonify(message="Bem-vindo à API segura com JWT!") if __name__ == "__main__": app.run(debug=True)
Agora, execute o arquivo:
python app.py
Acesse http://127.0.0.1:5000/ no seu navegador, e você verá a mensagem: "Bem-vindo à API segura com JWT!". Parabéns, você acabou de criar sua primeira API com Flask!

Adicionando autenticação com JWT

Até aqui, qualquer um pode acessar nossa API. Vamos mudar isso criando um sistema de login que gera um token JWT. Esse token será necessário para acessar rotas protegidas.
Adicione ao seu arquivo:
import jwt import os from datetime import datetime, timedelta from flask import request # Chave secreta para encriptação (ideal usar variável de ambiente em produção) SECRET_KEY = os.getenv("SECRET_KEY", "sua-chave-super-secreta") @app.route("/login", methods=["POST"]) def login(): data = request.get_json() if not data: return jsonify(message="Dados de login não fornecidos!"), 400 if "username" not in data or "password" not in data: return jsonify(message="Campos 'username' e 'password' são obrigatórios!"), 400 if data["username"] == "admin" and data["password"] == "123": # Gerar o token com expiração token = jwt.encode( {"user": data["username"], "exp": datetime.utcnow() + timedelta(minutes=30)}, SECRET_KEY, algorithm="HS256" ) return jsonify(token=token) return jsonify(message="Credenciais inválidas!"), 401
Nunca exponha sua SECRET_KEY no código. Em vez disso, use variáveis de ambiente para armazenar chaves e outros dados sensíveis. Isso aumenta a segurança e a flexibilidade da sua aplicação. Você pode usar bibliotecas como python-decouple para facilitar o gerenciamento das configurações.

O que fizemos aqui?

  1. Rota /login: recebe um username e password.
  1. Validação fictícia: só aceita admin e 123 como credenciais.
  1. Token gerado: o JWT contém o nome do usuário e uma validade de 30 minutos.
Teste no Postman ou Insomnia:
  1. Configure uma requisição POST para /login.
  1. Envie o JSON:
    1. { "username": "admin", "password": "123" }
  1. O servidor retornará um token como este:
    1. { "token": "eyJhbGciOiJIUzI1NiIsInR..." }
Esse token é seu ingresso para acessar rotas protegidas!

Protegendo rotas sensíveis

Agora, vamos criar uma rota que só pode ser acessada se o token JWT válido for enviado. Adicione ao seu código:
@app.route("/protected", methods=["GET"]) def protected(): # Obtém o token do cabeçalho da requisição auth_header = request.headers.get("Authorization") if not auth_header: return jsonify(message="Token é necessário!"), 403 parts = auth_header.split() if parts[0].lower() != 'bearer' or len(parts) != 2: return jsonify(message="Cabeçalho de autorização malformado!"), 401 token = parts[1] try: # Decodifica o token decoded = jwt.decode(token, SECRET_KEY, algorithms=["HS256"]) return jsonify(message=f"Bem-vindo, {decoded['user']}!") except jwt.ExpiredSignatureError: return jsonify(message="Token expirado! Faça login novamente."), 401 except jwt.InvalidTokenError: return jsonify(message="Token inválido!"), 403
O padrão para o envio do token JWT no cabeçalho Authorization é utilizar o prefixo Bearer. Por isso, precisamos dividir o conteúdo do cabeçalho para extrair o token corretamente. Isso garante compatibilidade com clientes que seguem as especificações de autenticação.

O que está acontecendo aqui?

  1. Token no cabeçalho: o cliente deve enviar o token no campo Authorization.
  1. Decodificação do token: validamos o token usando a mesma SECRET_KEY.
  1. Mensagens claras:
      • Token expirado? Mensagem amigável.
      • Token inválido? Bloqueamos o acesso.
Teste novamente no Postman:
  1. Faça login e copie o token gerado.
  1. Configure uma requisição GET para /protected.
  1. Adicione o token ao cabeçalho Authorization:
    1. Authorization: Bearer <seu-token>
  1. Se tudo estiver correto, você verá a mensagem:
    1. { "message": "Bem-vindo, admin!" }

Melhorando a segurança

A segurança é um processo contínuo. Aqui estão algumas dicas para deixar sua API ainda mais confiável:
  • Variáveis de ambiente: nunca exponha sua SECRET_KEY no código. Use bibliotecas como python-decouple.
  • HTTPS: Para garantir que as comunicações entre o cliente e o servidor sejam criptografadas, é essencial implementar HTTPS em sua aplicação. Isso protege os dados transmitidos, incluindo tokens de autenticação, contra interceptação por terceiros. Em ambientes de produção, obtenha certificados SSL/TLS de autoridades confiáveis ou use serviços como o Let's Encrypt para certificados gratuitos.
  • Tokens com expiração curta e Refresh Tokens: Definir um tempo de expiração curto para os tokens de acesso (por exemplo, 15 minutos) reduz o período em que um token comprometido pode ser utilizado. Para melhorar a experiência do usuário, implemente um sistema de refresh tokens que permite obter novos tokens de acesso sem exigir novo login, desde que o refresh token ainda seja válido. Isso adiciona uma camada extra de segurança e controle sobre a sessão do usuário.
  • Validação robusta: inclua verificações para evitar payloads maliciosos no JWT.

Por que aprender JWT é transformador?

Aprender JWT não é apenas sobre criar APIs seguras. É sobre entender como proteger dados, respeitar a privacidade dos usuários e construir aplicações que fazem a diferença no mundo. Como programadores, temos o poder de moldar o futuro digital e garantir que ele seja seguro e inclusivo para todos.
Seja você um iniciante ou um dev em busca de mais conhecimento, saiba que está no caminho certo. Persistência e prática são as chaves para o sucesso.

Recursos adicionais

Para aprofundar seus conhecimentos e consultar as referências oficiais, confira os seguintes recursos:
📚
  • JWT.io
    • Ferramenta online para decodificar, verificar e gerar tokens JWT.
Dica: Manter-se atualizado com a documentação oficial e as melhores práticas do mercado é fundamental para desenvolver aplicações seguras e eficientes.

Conclusão

A segurança na programação não é apenas uma habilidade técnica; é também um compromisso em entregar soluções confiáveis e eficientes. Ao aprender sobre autenticação JWT com Python, você não está apenas expandindo seu conhecimento técnico, mas também abrindo portas para criar projetos que respeitam os dados e a privacidade dos usuários.
Agora que você deu o primeiro passo e descobriu como JWT pode transformar a segurança das suas aplicações, o próximo passo é aprofundar ainda mais seus conhecimentos. A Rocketseat está ao seu lado nessa jornada, oferecendo ferramentas, formações e conteúdos que levam sua carreira para o próximo nível.
📚
  • Formação em Python
    • Quer se tornar um especialista em Python? Com projetos reais e um certificado validado pelo mercado, essa formação é ideal para quem quer criar aplicações completas e profissionais. Domine as principais ferramentas como Flask, Redis, MongoDB e muito mais. Conheça os planos e comece agora.
  • Guia sobre a Sintaxe do Python
    • Python é conhecido por sua sintaxe simples e legível, perfeita para iniciantes. Baixe gratuitamente este guia prático e tenha em mãos uma referência essencial para impulsionar seu aprendizado.
  • Curso gratuito de introdução ao Python
    • Pronto para colocar a mão na massa? Nesse curso gratuito, você aprenderá a criar uma API que simula um sistema de e-commerce, desde a criação de rotas até a autenticação de usuários e integração com banco de dados. Um excelente ponto de partida para sua jornada com Flask e desenvolvimento web.
🚀
A programação tem o poder de transformar vidas. Que tal começar a construir essa transformação hoje? Explore, pratique e conquiste novos horizontes. Estamos juntos nessa!

Aprenda programação do zero e DE GRAÇA

No Discover você vai descomplicar a programação, aprender a criar seu primeiro site com a mão na massa e iniciar sua transição de carreira.

COMECE A ESTUDAR AGORA