【问题标题】:Django Rest Framework - Authentication credentials were not providedDjango Rest Framework - 未提供身份验证凭据
【发布时间】:2015-01-10 11:10:21
【问题描述】:

我正在使用 Django Rest Framework 开发 API。我正在尝试列出或创建一个“订单”对象,但是当我尝试访问控制台时出现此错误:

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

观看次数:

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,)

序列化器:

class OrderSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Order
        fields = ('field1', 'field2')

还有我的网址:

# -*- 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)),
)

然后我在控制台中使用这个命令:

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

错误提示:

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

【问题讨论】:

  • 试试这个:curl -H "Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55" http://127.0.0.1:8000/api/orders/
  • 同样的错误。未提供身份验证凭据
  • 在我的情况下,这是由于队友将用户切换到非活动模式而发生的。
  • 先尝试阅读Authentication

标签: python django django-rest-framework


【解决方案1】:

如果你在 Apache 上使用 mod_wsgi 运行 Django,你必须添加

WSGIPassAuthorization On

在您的httpd.conf 中。否则,授权标头将被mod_wsgi剥离。

【讨论】:

  • 如果您想知道在哪里写这篇文章,请点击链接。 stackoverflow.com/questions/49340534/…
  • 对于 ubuntu 似乎没有 httpd.conf。所以你必须在/etc/apache2/apache2.conf中添加WSGIPassAuthorization On
  • 我对一个问题感到困惑,即我的 Postman 请求在我的本地主机上工作,但在发送到实时服务器时却没有。您的评论解决了我的问题。
  • 解决了我的问题,我能够通过本地主机上的 api 获取数据,但是当通过 https:// 部署在服务器上时,它给了我同样的错误。
  • 这只是在生产中还是在本地开发中也是如此?
【解决方案2】:

通过在我的 settings.py 中添加“DEFAULT_AUTHENTICATION_CLASSES”解决

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

【讨论】:

  • 以为我这样做了,但我已将 'rest_framework.authentication.TokenAuthentication' 添加到 DEFAULT_PERMISSION_CLASSES 而不是 DEFAULT_AUTHENTICATION_CLASSES
  • 感谢您的解决方案!但是,我不明白为什么我没有收到“未提供身份验证凭据”。使用 Postman 发出请求时出错,而当我的 Angular 客户端发出请求时,我 确实 得到了错误。两者都在授权标头中具有相同的令牌...
  • SessionAuthentication 默认启用并使用标准会话 cookie,因此您的 Angular(或其他 JS 框架)应用程序可能由于默认会话身份验证而正常工作。
【解决方案3】:

这可以帮助我在我的 settings.py 中没有“DEFAULT_PERMISSION_CLASSES”

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

【讨论】:

  • SessionAuthentication 为我解决了这个问题
  • 也为我修复了它。想知道为什么 Django 教程没有提到它。见django-rest-framework.org/tutorial/quickstart
  • 有没有人弄清楚它为什么会这样?移动设备上的会话与请求标头中的 jwt 令牌无关!经过 5 小时的挖掘,我对这个解决方案感到惊讶。
【解决方案4】:

如果您的request.userAnonymousUser 而不是实际有权访问该 URL 的正确用户,则可能会出现此问题。您可以通过打印 request.user 的值来查看。如果确实是匿名用户,这些步骤可能会有所帮助:

  1. 确保您的INSTALLED_APPS 中有'rest_framework.authtoken' 在您的settings.py 中。

  2. 确保你在 settings.py 的某个地方有这个:

    REST_FRAMEWORK = {
    
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.TokenAuthentication',
            # ...
        ),
    
        # ...
    }
    
  3. 确保您拥有登录用户的正确令牌。如果您没有令牌,请了解如何获取它here。 基本上,如果您提供正确的用户名和密码,您需要向视图发出POST 请求,该视图会为您提供令牌。示例:

    curl -X POST -d "user=Pepe&password=aaaa"  http://localhost:8000/
    
  4. 确保您尝试访问的视图具有这些:

    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. 现在这样使用curl

    curl -X (your_request_method) -H  "Authorization: Token <your_token>" <your_url>
    

例子:

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

【讨论】:

  • 如何打印request.user?似乎永远不会处理基于类的视图的 POST 方法。我还能在哪里尝试打印用户?
  • 用户必须经过身份验证才能在请求对象中设置。否则它只会打印匿名用户。您如何验证您的用户?
【解决方案5】:

如果您在命令行中玩耍(使用 curl 或 HTTPie 等),您可以使用 BasicAuthentication 来测试/使用您的 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',
        )
    }

然后您可以使用curl

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

httpie(看起来更容易):

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

或其他类似Advanced Rest Client (ARC)

【讨论】:

  • BasicAuthentication 不是简单的命令行认证
【解决方案6】:

我也面临同样的问题,因为我错过了添加

authentication_classes = (TokenAuthentication)

在我的 API 视图类中。

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

除了上述之外,我们还需要在settings.py文件中明确告诉Django关于Authentication

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

【讨论】:

    【解决方案7】:

    对我来说,我必须在 Django DRF 上使用“JWT”而不是“Bearer”或“Token”来添加我的 Authorization 标头。然后它开始工作。 例如 -

    Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh

    【讨论】:

    • 这里也一样。使用 Next.JS 和 Django DRF 作为后端。
    • 同意。第一次用 react 尝试 django,你的回答对我有帮助。
    【解决方案8】:

    我在使用邮递员时遇到了这个问题。将其添加到标题中...

    【讨论】:

    • 就我而言,我没有选中复选框... :) 谢谢,这给了我线索
    • 我正在使用 Thunder 客户端(VS 代码的扩展)来检查我的 API。当我们添加新的字段标题或其他内容时,会自动检查该复选框。所以这件事从来没有出现在我的脑海里。但是在看到这个答案后,我取消选中该复选框,然后再次选中它并且有效。谢谢..
    【解决方案9】:

    试试这个,它对我有用。

    在 settings.py 中

    SIMPLE_JWT = {
         ....
         ...
         # Use JWT 
         'AUTH_HEADER_TYPES': ('JWT',),
         # 'AUTH_HEADER_TYPES': ('Bearer',),
         ....
         ...
    }
    

    也添加这个

    REST_FRAMEWORK = {
        ....
        ...
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework_simplejwt.authentication.JWTAuthentication',
        )
        ...
        ..
    }
    

    【讨论】:

      【解决方案10】:

      settings.py 中添加SessionAuthentication 就可以了

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

      【讨论】:

        【解决方案11】:

        由于是会话登录,因此您需要提供凭据 也一样 127.0.0:8000/admin 管理员并稍后登录它会正常工作

        【讨论】:

        • 抱歉,这个问题的答案已经比你的详细了...
        • 这是给需要快速解决方案的人
        【解决方案12】:

        如果您使用的是authentication_classes,那么您应该在User 模型中使用is_active 作为True,默认情况下可能是False

        【讨论】:

        • 什么是认证类?
        • 我们如何做到这一点?
        【解决方案13】:

        如果有人从Full Stack React & Django [5] - Django Token Authentication - Traversy Media 来这里,那么你需要这样的东西

        accounts/api.py

        from rest_framework import generics, permissions
        from rest_framework.response import Response
        from knox.models import AuthToken
        from .serializers import LoginSerializer, RegisterSerializer, UserSerializer
        from knox.auth import TokenAuthentication
        
        # Register Api
        
        
        class RegisterAPI(generics.GenericAPIView):
            serializer_class = RegisterSerializer
        
            def post(self, request, *args, **kwargs):
                serializer = self.get_serializer(data=request.data)
                serializer.is_valid(raise_exception=True)
                user = serializer.save()
                return Response({
                    "user": UserSerializer(user, context=self.get_serializer_context()).data,
                    "token": AuthToken.objects.create(user)[1]
                })
        
        # Login Api
        
        
        class LoginAPI(generics.GenericAPIView):
            serializer_class = LoginSerializer
        
            def post(self, request, *args, **kwargs):
                serializer = self.get_serializer(data=request.data)
                serializer.is_valid(raise_exception=True)
                user = serializer.validated_data
                return Response({
                    "user": UserSerializer(user, context=self.get_serializer_context()).data,
                    "token": AuthToken.objects.create(user)[1]
                })
        
        # Get User Api
        
        
        class UserAPI(generics.RetrieveAPIView):
            authentication_classes = (TokenAuthentication,)
            permission_classes = [
                permissions.IsAuthenticated,
            ]
        
            serializer_class = UserSerializer
        
            def get_object(self):
                return self.request.user
        

        【讨论】:

          【解决方案14】:

          还要确保授权令牌/API 密钥确实有效。如果密钥无效,Authentication credentials were not provided. 错误消息似乎也是 API 返回的内容(我在不小心使用了错误的 API 密钥时遇到了这种情况)。

          【讨论】:

            猜你喜欢
            • 2015-05-16
            • 2019-04-29
            • 2015-02-05
            • 2018-02-25
            • 2019-02-19
            • 2021-06-15
            • 2022-11-10
            • 1970-01-01
            • 2020-07-17
            相关资源
            最近更新 更多