Login Django com JWT

O Django inclui um sistema de autenticação completo: models de usuário, sessões, views de login/logout e hash de senha. Tudo isso sem instalar nada a mais.

TL;DR: Implemente autenticação de usuários no Django usando o sistema de auth embutido e tokens JWT para DRF.
Stack: Python, Django, djangorestframework-jwt
Nível: Iniciante
Tempo de leitura: ~7 min

Instalar

Django==3.0.8
djangorestframework==3.14.0
djangorestframework-jwt==1.11.0

Configurar JWT no settings.py

JWT_AUTH = {
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'api.utils.jwt_response_payload_handler',
}

Adicionar rota de login no urls.py

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login', obtain_jwt_token),
]

Criar serializers.py

from rest_framework import serializers
from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()
    username = serializers.CharField()
    password = serializers.CharField()
    email = serializers.CharField()

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'email')

Criar utils.py (payload JWT personalizado)

from .serializers import UserSerializer

def jwt_response_payload_handler(token, user=None, request=None):
    user_data = UserSerializer(user, context={'request': request}).data
    return {
        'token': token,
        'userid': user_data['id'],
        'username': user_data['username'],
    }

Criar endpoint de usuário

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password

@api_view(['POST'])
def create_user(request):
    username = request.data.get('username')
    email = request.data.get('email')
    password = request.data.get('password')

    if not username or not email or not password:
        return Response({'error': 'Campos obrigatórios faltando'}, status=status.HTTP_400_BAD_REQUEST)

    if User.objects.filter(username=username).exists() or User.objects.filter(email=email).exists():
        return Response({'error': 'Username ou email já existe'}, status=status.HTTP_400_BAD_REQUEST)

    user = User(username=username, email=email, password=make_password(password))
    user.save()
    return Response({'success': 'Usuário criado com sucesso'}, status=status.HTTP_201_CREATED)

O que você construiu

Autenticação JWT no Django funcionando de ponta a ponta: um endpoint de login que retorna um token, um payload personalizado com informações do usuário e um endpoint de criação de usuário.

Próximos passos

  • Adicione AUTHENTICATION_BACKENDS para suportar login por e-mail em vez de username, que é o que a maioria dos usuários espera.
  • Use Django AllAuth para autenticação social (Google, GitHub) quando precisar de login OAuth sem construir do zero.
  • Estenda o model User padrão com um perfil OneToOneField para adicionar dados específicos do usuário sem modificar o modelo de auth.

Dúvidas ou feedback? Me encontre no LinkedIn ou GitHub.

Deixe um comentário