python-2.7 - modelserializer - django rest framework token tutorial
Django Rest Framework solicita autenticaciĆ³n en la configuraciĆ³n AllowAny (2)
Creé un backend autorizado por JWT para una aplicación. Iniciar sesión, cerrar sesión, recuperar fichas y actualizar todo funciona bien, y como se esperaba. Agregué una vista de registro esta mañana, que arroja el "detail": "Authentication credentials were not provided.
habitual "detail": "Authentication credentials were not provided.
Error que se esperaría para las solicitudes no autenticadas, ya que es el predeterminado (ver a continuación).
Sin embargo, como este es un punto final de registro, no quiero que solo permita solicitudes autorizadas. (Habiendo comprobado con un token válido, el resto de la vista funciona como se espera cuando proporciona la autenticación.) Mirando la sección de permisos de los documentos de DRF , pensé que el uso del wrapper de permission_classes con AllowAny funcionaría aquí, pero no tiene .
¿Qué me estoy perdiendo? Siento que el decorador de permission_classes debe anular la configuración predeterminada de ''IsAuthenticated''?
Estoy probando localhost desde curl:
curl -X POST -H "Content-Type: application/json" -d ''{"email":"[email protected]", "first_name": "boba", "last_name": "fett" "password":"xyz"}'' http://localhost:8000/account/register/
Ver es:
@permission_classes(AllowAny)
@api_view([''POST''])
def register_user(request):
from django.contrib.auth.models import User
from rest_framework_jwt.views import obtain_jwt_token
if request.user.is_authenticated():
return Response ({"already_registered": "User with that username has already registered"}, status=status.HTTP_701_ALREADY_REGISTERED)
data = request.data
user, created = User.objects.get_or_create(username=data["email"],
email=data["email"],
first_name=data["first_name"],
last_name=data["last_name"],
password=data["password"])
if created:
token = obtain_jwt_token(data["email"],data["password"] )
return Response ({"token": token}, status=status.HTTP_200_OK)
else:
return Response ({"already_registered": "User with that username has already registered"}, status=status.HTTP_701_ALREADY_REGISTERED)
Los permisos en settings.py son:
REST_FRAMEWORK = {
''DEFAULT_PERMISSION_CLASSES'': (
''rest_framework.permissions.IsAuthenticated'',
),
''DEFAULT_AUTHENTICATION_CLASSES'': (
''rest_framework.authentication.SessionAuthentication'',
''rest_framework.authentication.BasicAuthentication'',
''rest_framework_jwt.authentication.JSONWebTokenAuthentication'',
),
}
Preguntas relacionadas: Django Rest Framework: no se proporcionaron las credenciales de autenticación : creo que los permisos predeterminados son correctos, solo quiero sobrescribirlos en esta instancia.
Django Rest Framework - ELIMINAR fallo de llamada ajax debido a un token CSFR incorrecto - CSRF no se usa como autenticación basada en JWT.
Cabecera de autenticación de Django: Rest Framework : problema específico de Apache (actualmente todavía en el servidor local devserver)
Las credenciales de autenticación de Django Rest Framework no fueron proporcionadas . ¡Aún no respondidas!
El orden de los decoradores importa. También hay algunos problemas con tu código.
Recomiendo usar un serializador, tal vez algo como a continuación. Si desea utilizar los correos electrónicos como nombre de usuario, crearía un modelo de usuario personalizado. El campo de nombre de usuario del sistema de autenticación predeterminado de Django tiene una longitud máxima de 30, y las direcciones de correo electrónico de las personas superan fácilmente eso.
class UserSerializer(serializers.ModelSerializer):
first_name = serializers.CharField(required=False, allow_null=True)
last_name = serializers.CharField(required=False, allow_null=True)
class Meta:
model = User
fields = (''id'', ''username'', ''first_name'', ''last_name'', ''email'', ''password'')
def create(self, validated_data):
return User.objects.create_user(**validated_data)
@api_view([''POST''])
@permission_classes([permissions.AllowAny,])
def register_user(request):
if request.user.is_authenticated():
return Response({"already_registered": "User with that username has already registered"}, status=701)
data = request.data
serializer = UserSerializer(data=data, partial=True)
if serializer.is_valid():
serializer.save(username=serializer.validated_data[''email''])
token = #call the url to get your tokens, use urllib or something similar
return Response({"token": token}, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Editar El orden de los decoradores es el siguiente:
@decorator
@decorator2
def func():
print(''hello world'')
Es lo mismo que decorador (decorator2 (func)))
Ha inhabilitado los permisos mediante @permission_classes
, pero esa es solo la parte de "autorización" de "autenticación y autorización". También debe deshabilitar los controladores de autenticación usando @authentication_classes
para dejar de recibir un error 401/403.