Intermediário 8 min de leitura 10/08/2026

Como criar autenticação com JWT no Django REST Framework

Login com JWT no Django REST Framework: tokens de acesso, refresh e blacklist

Toda API que expõe dados de usuário precisa de autenticação. Sessões funcionam para apps Django tradicionais, mas quando você tem um frontend separado (React, mobile), JWT é o padrão. Vamos implementar do zero — login, token de acesso, refresh e proteção de endpoints.

O que é JWT e por que usar

JWT (JSON Web Token) é um token assinado que o servidor gera no login e o cliente envia em cada requisição. O servidor valida a assinatura sem precisar de banco de dados — escalável e stateless.

Ele tem três partes separadas por ponto: header.payload.signature. O payload carrega dados do usuário (id, email), mas não é criptografado — apenas assinado. Nunca guarde dados sensíveis nele.

Instalação

pip install djangorestframework djangorestframework-simplejwt

Configurando o settings.py

INSTALLED_APPS = [
    ...
    "rest_framework",
]

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ),
    "DEFAULT_PERMISSION_CLASSES": (
        "rest_framework.permissions.IsAuthenticated",
    ),
}

from datetime import timedelta

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=30),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=7),
    "ROTATE_REFRESH_TOKENS": True,
    "BLACKLIST_AFTER_ROTATION": True,
}

URLs de autenticação

from django.urls import path
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
    TokenBlacklistView,
)

urlpatterns = [
    path("api/token/", TokenObtainPairView.as_view()),       # login
    path("api/token/refresh/", TokenRefreshView.as_view()),  # renovar token
    path("api/token/blacklist/", TokenBlacklistView.as_view()), # logout
]
Para usar blacklist (invalidar tokens no logout), adicione rest_framework_simplejwt.token_blacklist em INSTALLED_APPS e rode migrate.

Criando um endpoint protegido

from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(["GET"])
def meu_perfil(request):
    # request.user está disponível porque o token foi validado
    return Response({
        "email": request.user.email,
        "id": request.user.id,
    })

Testando com curl

1. Login — obter tokens

curl -X POST http://localhost:8000/api/token/ \
  -H "Content-Type: application/json" \
  -d '{"email": "user@exemplo.com", "password": "suasenha"}'

# Resposta:
# {
#   "access": "eyJ...",
#   "refresh": "eyJ..."
# }

2. Usar o access token

curl http://localhost:8000/api/meu-perfil/ \
  -H "Authorization: Bearer eyJ..."

3. Renovar o access token expirado

curl -X POST http://localhost:8000/api/token/refresh/ \
  -H "Content-Type: application/json" \
  -d '{"refresh": "eyJ..."}'

Customizando o payload do token

Por padrão o token inclui apenas o user_id. Para incluir email e nome:

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView

class MeuTokenSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)
        token["email"] = user.email
        token["nome"] = user.get_full_name()
        return token

class MeuTokenView(TokenObtainPairView):
    serializer_class = MeuTokenSerializer

Próximos passos

Com autenticação funcionando, o próximo passo natural é coletar dados externos para popular sua API — e o tutorial de web scraping com Playwright mostra exatamente isso.