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.