Django Rest Framework – No se proporcionaron las credenciales de autenticación

Estoy desarrollando una API usando Django Rest Framework. Estoy intentando enumerar o crear un objeto de “Orden”, pero cuando bash acceder a la consola, aparece este error:

{"detail": "Authentication credentials were not provided."} 

Puntos de vista:

 from django.shortcuts import render from rest_framework import viewsets from django.contrib.auth.models import User from rest_framework.renderers import JSONRenderer, YAMLRenderer from rest_framework.response import Response from rest_framework.views import APIView from order.models import * from API.serializers import * from rest_framework.permissions import IsAuthenticated class OrderViewSet(viewsets.ModelViewSet): model = Order serializer_class = OrderSerializer permission_classes = (IsAuthenticated,) 

Serializador:

 class OrderSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Order fields = ('field1', 'field2') 

Y mis URLs:

 # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url from django.conf import settings from django.contrib import admin from django.utils.functional import curry from django.views.defaults import * from rest_framework import routers from API.views import * admin.autodiscover() handler500 = "web.views.server_error" handler404 = "web.views.page_not_found_error" router = routers.DefaultRouter() router.register(r'orders', OrdersViewSet) urlpatterns = patterns('', url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'), url(r'^api/', include(router.urls)), ) 

Y luego estoy usando este comando en la consola:

 curl -X GET http://127.0.0.1:8000/api/orders/ -H 'Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55' 

Y el error dice:

 {"detail": "Authentication credentials were not provided."} 

Si está ejecutando Django en Apache usando mod_wsgi, debe agregar

 WSGIPassAuthorization On 

en su httpd.conf. De lo contrario, el encabezado de autorización será eliminado por mod_wsgi.

Resuelto agregando “DEFAULT_AUTHENTICATION_CLASSES” a mi configuración.py

 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAdminUser' ), } 

Esto me ayudó sin “DEFAULT_PERMISSION_CLASSES” en mi configuración.py

 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ), 'PAGE_SIZE': 10 } 

Solo para otras personas que ingresan aquí con el mismo error, este problema puede surgir si su request.user usuario es AnonymousUser y no el usuario correcto que está realmente autorizado para acceder a la URL. Puedes ver eso imprimiendo el valor de request.user . Si es un usuario anónimo, estos pasos pueden ayudar:

  1. Asegúrese de tener 'rest_framework.authtoken' en INSTALLED_APPS en su settings.py .

  2. Asegúrese de tener esto en algún lugar en settings.py :

     REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', # ... ), # ... } 
  3. Asegúrese de tener el token correcto para el usuario que ha iniciado sesión. Si no tiene el token, aprenda cómo obtenerlo aquí . Básicamente, debe realizar una solicitud POST a una vista que le proporcione el token si proporciona el nombre de usuario y la contraseña correctos. Ejemplo:

     curl -X POST -d "user=Pepe&password=aaaa" http://localhost:8000/ 
  4. Asegúrese de que la vista a la que está intentando acceder tenga estos:

     class some_fancy_example_view(ModelViewSet): """ not compulsary it has to be 'ModelViewSet' this can be anything like APIview etc, depending on your requirements. """ permission_classes = (IsAuthenticated,) authentication_classes = (TokenAuthentication,) # ... 
  5. Usa curl ahora de esta manera:

     curl -X (your_request_method) -H "Authorization: Token "  

Ejemplo:

  curl -X GET http://127.0.0.1:8001/expenses/ -H "Authorization: Token 9463b437afdd3f34b8ec66acda4b192a815a15a8" 

Si está jugando en la línea de comandos (usando curl, o HTTPie, etc.) puede usar BasicAuthentication para probar / usar su API

  REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', # enables simple command line authentication 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', ) } 

A continuación, puede utilizar rizo

 curl --user user:password -X POST http://example.com/path/ --data "some_field=some data" 

o httpie (es más fácil en los ojos):

 http -a user:password POST http://example.com/path/ some_field="some data" 

o algo más como Advanced Rest Client (ARC)

Yo también me enfrenté a lo mismo ya que extrañaba agregar

authentication_classes = (TokenAuthentication)

en mi clase de vista API.

 class ServiceList(generics.ListCreateAPIView): authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication) queryset = Service.objects.all() serializer_class = ServiceSerializer permission_classes = (IsAdminOrReadOnly,) 

Además de lo anterior, debemos informar explícitamente a Django sobre la autenticación en el archivo settings.py.

 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ) } 

Agregar SessionAuthentication en settings.py hará el trabajo

REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', ), }