Django बाकी फ्रेमवर्क - प्रमाणीकरण क्रेडेंशियल्स प्रदान नहीं किए गए थे


105

मैं Django रेस्ट फ्रेमवर्क का उपयोग करके एक एपीआई विकसित कर रहा हूं। मैं "ऑर्डर" ऑब्जेक्ट को सूचीबद्ध करने या बनाने की कोशिश कर रहा हूं, लेकिन जब मैं कंसोल तक पहुंचने की कोशिश कर रहा हूं तो मुझे यह त्रुटि मिलती है:

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

serializer:

class OrderSerializer(serializers.HyperlinkedModelSerializer):

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

और मेरे URL:

# -*- 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."}

5
इसे आजमाएँ:curl -H "Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55" http://127.0.0.1:8000/api/orders/
cor

1
वही त्रुटि। प्रमाणीकरण क्रेडेंशियल प्रदान नहीं किए गए थे
मार्कोस अगुआयो

मेरे मामले में एक टीममेट द्वारा उपयोगकर्ता को निष्क्रिय मोड में स्विच करने के कारण ऐसा हुआ।
ब्रॉक

पहले ऑथेंटिकेशन पढ़ने की कोशिश करें ।
अंतहीन

@endless सवाल 3 साल पहले का था। यह पहले से ही हल है
मार्कोस अगुआयो

जवाबों:


167

यदि आप mod_wsgi का उपयोग करके अपाचे पर runnig Django जोड़ रहे हैं

WSGIPassAuthorization On

अपने httpd.conf में। अन्यथा प्राधिकरण हेडर mod_wsgi द्वारा छीन लिया जाएगा।


1
यदि आप सोच रहे हैं कि यह कहां लिखा जाए, तो लिंक का अनुसरण करें। stackoverflow.com/questions/49340534/…
user2858738

2
ubuntu के लिए वहाँ कोई नहीं लगता है httpd.conf। ताकि आप जोड़ने के लिए WSGIPassAuthorization Onमें/etc/apache2/apache2.conf
suhailvs

मैं एक ऐसे मुद्दे से उलझन में था जहां पोस्टमैन से मेरे अनुरोध मेरे लोकलहोस्ट से काम कर रहे थे लेकिन लाइव सर्वर पर भेजे जाने पर नहीं। आपकी टिप्पणी से मेरी समस्या हल हो गई।
रोमेल्टज 14

मेरी समस्या का समाधान, मैं अपने लोकलहोस्ट पर एपीआई के माध्यम से डेटा प्राप्त करने में सक्षम था, लेकिन जब https: // पर सर्वर पर तैनात किया गया, तो यह मुझे एक ही त्रुटि दे रहा था।
मीर सुहैल

क्या यह केवल उत्पादन में या स्थानीय विकास के लिए भी सही है?
MadPhysicist

97

मेरी सेटिंग में "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_CLASSESDEFAULT_AUTHENTICATION_CLASSES
नेटिगर

4
इस समाधान के लिए धन्यवाद! मुझे समझ में नहीं आता है कि मुझे "प्रमाणीकरण प्रमाणिकता क्यों नहीं प्रदान की गई।" पोस्टमैन के साथ अनुरोध करते समय त्रुटि, जबकि मेरे कोणीय ग्राहक द्वारा अनुरोध किए जाने पर मुझे त्रुटि मिली । ऑथराइजेशन हेडर में एक ही टोकन के साथ दोनों ...
सैंडर वांडेन हाउते

SessionAuthenticationडिफ़ॉल्ट रूप से सक्षम है और मानक सत्र कुकीज़ के साथ काम करता है, इसलिए यह संभावना है कि आपका कोणीय (या अन्य JS फ्रेमवर्क) एप्लिकेशन डिफ़ॉल्ट सत्र प्रमाणीकरण के कारण काम कर रहा था।
केविन ब्राउन

29

यह मेरी सेटिंग में "DEFAULT_PERMISSION_CLASSES" के बिना मेरी मदद करता है

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

3
SessionAuthenticationक्या मेरे लिए यह तय था
Caleb_Allen

मेरे लिए भी तय किया। आश्चर्य है कि इस पर Django ट्यूटोरियल इसका उल्लेख क्यों नहीं करता है। Django-rest-framework.org/tutorial/quickstart देखें ।
निक टी

15

बस अन्य लोगों को एक ही त्रुटि के साथ यहाँ तक उतरने के लिए, यदि आपके इस मुद्दे पैदा कर सकते request.userहै AnonymousUserऔर न सही उपयोगकर्ता जो वास्तव में URL तक पहुँचने के लिए अधिकृत है। आप इसका मान प्रिंट करके देख सकते हैं request.user। यदि यह वास्तव में एक अनाम उपयोगकर्ता है, तो ये कदम मदद कर सकते हैं:

  1. सुनिश्चित करें कि आपने 'rest_framework.authtoken'में INSTALLED_APPSअपने में settings.py

  2. सुनिश्चित करें कि आपके पास यह कहीं है settings.py:

    REST_FRAMEWORK = {
    
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.TokenAuthentication',
            # ...
        ),
    
        # ...
    }
    
  3. सुनिश्चित करें कि आपके पास लॉग इन करने वाले उपयोगकर्ता के लिए सही टोकन है। यदि आपके पास टोकन नहीं है, तो जानें कि यह कैसे प्राप्त करें । मूल रूप से, आपको 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 विधि कभी संसाधित नहीं हो रही है। उपयोगकर्ता को प्रिंट करने के लिए मैं और कहां प्रयास कर सकता हूं?
MadPhysicist

उपयोगकर्ता को अनुरोध ऑब्जेक्ट में सेट होने में सक्षम होने के लिए प्रमाणित किया जाना है। अन्यथा यह सिर्फ अनाम उपयोगकर्ता को प्रिंट करता है। आप अपने उपयोगकर्ता को कैसे प्रमाणित कर रहे हैं?
शेरेलॉक

11

यदि आप कमांड लाइन में चारों ओर खेल रहे हैं (कर्ल, या HTTPie आदि का उपयोग करके) तो आप अपने उपयोगकर्ता की एपीआई का परीक्षण करने के लिए BasicAuthentication का उपयोग कर सकते हैं

    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 --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"

या उन्नत रेस्ट क्लाइंट (एआरसी) की तरह कुछ और


9

मैं भी उसी का सामना कर रहा था क्योंकि मैं जोड़ना भूल गया था

प्रमाणीकरण_क्लास = (टोकनएथेंटिकेशन)

मेरे एपीआई दृश्य वर्ग में।

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

उपरोक्त के अलावा, हमें Django को स्पष्ट रूप से सेटिंग्सहोम फ़ाइल में प्रमाणीकरण के बारे में बताने की आवश्यकता है ।

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

3

सेटिंग्स में SessionAuthentication जोड़ने से काम हो जाएगा

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


3

मेरे लिए, मुझे Django DRF पर "बेयरर" या "टोकन" के बजाय "JWT" ​​के साथ अपने प्राधिकरण शीर्षलेख को प्रस्तुत करना था। फिर इसने काम करना शुरू कर दिया। जैसे -

Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh


मुझे भी। Backend के रूप में Django DRF के साथ Next.JS का उपयोग करना।
केनेहो

2

मुझे पोस्टमैन के साथ यह समस्या हो रही थी। हेडर को यह बताएं ... यहाँ छवि विवरण दर्ज करें


मेरे मामले में, मैंने चेकबॉक्स का चयन नहीं किया था ... :) धन्यवाद, इससे मुझे सुराग मिला
लक्ष्मीकांत

1

चूंकि यह सत्र लॉग इन है, इसलिए आपको आपको क्रेडेंशियल प्रदान करने की आवश्यकता है ताकि 127.0.0:8000/admin व्यवस्थापक करें और बाद में लॉगिन करें यह ठीक काम करेगा


1
क्षमा करें, लेकिन यह सवाल पहले से ही आपके साथ अधिक विस्तार के साथ उत्तर दिया गया है ...
मुहम्मद व्यास यास्कुर

यह उन लोगों के लिए है जिन्हें त्वरित समाधान की आवश्यकता है
ऐश्वर्या कबड्डी

1

संभवतः यह काम कर सकता है

सेटिंग्स में

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

इसे भी जोड़ें

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

0

यदि आप उपयोग कर रहे हैं authentication_classesतो आपके पास मॉडल के is_activeरूप Trueमें होना चाहिए User, जो Falseडिफ़ॉल्ट रूप से हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.