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), adicionerest_framework_simplejwt.token_blacklistemINSTALLED_APPSe rodemigrate.
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.