Saltar al contenido

¿Cómo puedo hacer que django-rest-framework-jwt devuelva el token al registrarse?

Nuestros mejores desarrolladores agotaron sus provisiones de café, buscando todo el tiempo por la resolución, hasta que Maximiliano encontró el resultado en Gogs y hoy la compartimos contigo.

Solución:

Pregunta 1: Para generar tokens manualmente al registrarse, puede definir y utilizar un método como este:

import jwt
from rest_framework_jwt.utils import jwt_payload_handler

def create_token(user):
    payload = jwt_payload_handler(user)
    token = jwt.encode(payload, settings.SECRET_KEY)
    return token.decode('unicode_escape')

puede agregar este método a la vista y generar el token una vez que el usuario se haya registrado y devolverlo en la respuesta.

Pregunta 2: los tokens JWT no necesitan almacenarse en la base de datos. Puede leer más sobre cómo funciona JWT en http://jwt.io/.

Pregunta 3 y 4: para usar tokens para limitar el acceso a una vista específica, especialmente una APIView o una de sus subclases o una vista proporcionada por Django Rest framework, debe especificar las clases de permiso. por ejemplo:

from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        content = 
            'status': 'request was permitted'
        
        return Response(content)

Pregunta 5: Una laguna potencial al trabajar con Django Rest Framework son los permisos predeterminados que configura desde la configuración de su aplicación; si por ejemplo tu AllowAny en la configuración, hará que todas las vistas sean de acceso público a menos que anule específicamente las clases de permisos en cada vista.

La respuesta aceptada tiene algún código que genera un token pero no muestra cómo integrarlo en el serializador/vista. Tampoco estoy seguro de que el manual jwt.encode es una buena forma moderna de hacer esto si ya tenemos jwt_encode_handler
para hacer esto. puedes crear SerializerMethodField y crea tokens allí:

token = serializers.SerializerMethodField()

def get_token(self, obj):
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

    payload = jwt_payload_handler(obj)
    token = jwt_encode_handler(payload)
    return token

Luego añade token campo a Meta.fields.

Ejemplo de trabajo

Te invitamos a añadir valor a nuestra información participando con tu experiencia en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *