জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক - প্রমাণীকরণের শংসাপত্র সরবরাহ করা হয়নি


106

আমি জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক ব্যবহার করে একটি এপিআই বিকাশ করছি। আমি একটি "অর্ডার" অবজেক্ট তালিকাবদ্ধ বা তৈরি করার চেষ্টা করছি, কিন্তু যখন আমি কনসোলটি অ্যাক্সেস করার চেষ্টা করছি তখন আমাকে এই ত্রুটি দেয়:

{"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."}

4
এটি চেষ্টা করুন:curl -H "Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55" http://127.0.0.1:8000/api/orders/
কর

4
একই ত্রুটি। প্রমাণীকরণের শংসাপত্রগুলি সরবরাহ করা হয়নি
মার্কোস আগুয়াও

আমার ক্ষেত্রে এটি একটি সতীর্থ ব্যবহারকারীকে নিষ্ক্রিয় মোডে স্যুইচ করার কারণে ঘটেছিল।
ব্রক

প্রথমে প্রমাণীকরণ পড়ার চেষ্টা করুন ।
অন্তহীন

@endless প্রশ্নটি 3 বছর আগে ছিল। এটি ইতিমধ্যে সমাধান হয়েছে
মার্কোস আগুয়াও

উত্তর:


168

আপনি যদি Mod_wsgi ব্যবহার করে অ্যাপাচে জাজানো রান্নিগ হন তবে আপনাকে যুক্ত করতে হবে

WSGIPassAuthorization On

আপনার httpd.conf এ। অন্যথায় অনুমোদনের শিরোনামটি মোড_উসজি দ্বারা ছাঁটাই করে দেওয়া হবে।


4
আপনি যদি ভাবছেন যে এটি কোথায় লিখবেন, লিঙ্কটি অনুসরণ করুন। stackoverflow.com/questions/49340534/...
user2858738

4
উবুন্টুর জন্য মনে হয় না httpd.conf। সুতরাং আপনাকে যুক্ত WSGIPassAuthorization Onকরতে হবে/etc/apache2/apache2.conf
suhailvs

আমি এমন একটি সমস্যায় বিভ্রান্ত হয়ে পড়েছিলাম যেখানে পোস্টম্যানের কাছ থেকে আমার অনুরোধগুলি আমার লোকালহোস্ট থেকে কাজ করছে তবে লাইভ সার্ভারে প্রেরণের সময় নয়। আপনার মন্তব্য আমার সমস্যা সমাধান করেছে।
রোমেলটিজে

আমার সমস্যার সমাধান, আমি আমার লোকালহোস্টে এপিআইয়ের মাধ্যমে ডেটা পেতে সক্ষম হয়েছি, তবে https: // এর মাধ্যমে সার্ভারে স্থাপন করার সময় এটি আমাকে একই ত্রুটি দিচ্ছিল।
মীর সুহাইল

এটি কি কেবল উত্পাদন বা স্থানীয় উন্নয়নে সত্য?
ম্যাডফিজিসিস্ট

100

আমার সেটিংস.পিতে "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
netigger

4
এই সমাধানের জন্য ধন্যবাদ! আমি বুঝতে পারি না কেন কেন আমি "প্রমাণীকরণের শংসাপত্র সরবরাহ করা হয়নি"। ত্রুটি, পিয়ন দিয়ে অনুরোধ করছে যেহেতু আমি করেনি যখন আমার কৌণিক ক্লায়েন্ট রিকোয়েস্ট করেছেন ভুল পান। অনুমোদনের শিরোনামে উভয়ই একই টোকেন ...
স্যান্ডার বান্দেন হউত্তে

SessionAuthenticationডিফল্টরূপে সক্ষম করা হয় এবং স্ট্যান্ডার্ড সেশন কুকিজের সাথে কাজ করে, তাই সম্ভবত আপনার অ্যাংুলার (বা অন্য জেএস ফ্রেমওয়ার্ক) অ্যাপ্লিকেশনটি ডিফল্ট সেশন প্রমাণীকরণের কারণে কাজ করছে।
কেভিন ব্রাউন

29

এটি আমার সেটিংস.পিপিতে "DEFAULT_PERMISSION_CLASSES" ছাড়াই আমাকে সাহায্য করবে

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

4
SessionAuthenticationআমার জন্য কি এটি সংশোধন করা ছিল
Caleb_Allen

এটা আমার জন্য স্থির। আশ্চর্য যে কেন জ্যাঙ্গো টিউটোরিয়াল এটির উল্লেখ করে না। 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. লগ ইন হওয়া ব্যবহারকারীর জন্য আপনার কাছে সঠিক টোকেন রয়েছে কিনা তা নিশ্চিত করুন you আপনার কাছে টোকেন না থাকলে কীভাবে এটি এখানে পাবেন তা শিখুন । মূলত, আপনাকে 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 পদ্ধতিটি কখনও প্রক্রিয়াজাত হয় না। আমি আর কোথায় ব্যবহারকারীর মুদ্রণের চেষ্টা করতে পারি?
ম্যাডফিজিসিস্ট

অনুরোধ অবজেক্টে সেট হয়ে উঠতে সক্ষম হতে ব্যবহারকারীকে প্রমাণীকরণ করতে হবে। অন্যথায় এটি কেবল বেনামে ব্যবহারকারীর প্রিন্ট করে। আপনি কিভাবে আপনার ব্যবহারকারীকে প্রমাণীকরণ করছেন?
শেরলক

12

আপনি যদি কমান্ড লাইনে (কার্ল, বা এইচটিটিপি ইত্যাদি ব্যবহার করে) খেলছেন তবে আপনি আপনার এপিআই পরীক্ষা / ব্যবহারকারীর জন্য বেসিক অথেন্টিফিকেশন ব্যবহার করতে পারেন

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

উপরের পাশাপাশি, আমাদের জাংগোকে স্পষ্টভাবে সেটিংস.পি ফাইলটিতে প্রমাণীকরণ সম্পর্কে জানাতে হবে।

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

3

সেটিংস.পি-তে সেশনআউথেন্টিকেশন যুক্ত করা কাজটি করবে

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


3

আমার জন্য, জাজানো ডিআরএফ-এ "বেয়ারার" বা "টোকেন" এর পরিবর্তে আমাকে আমার অনুমোদনের শিরোনামটি "জেডাব্লুটিটি" দিয়ে প্রিপেন্ড করতে হয়েছিল। তারপরে এটি কাজ শুরু করে। যেমন -

Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh


একই অবস্থা. জ্যাকানো ডিআরএফের সাথে নেক্সট.জেএস ব্যাকএন্ড হিসাবে ব্যবহার করা হচ্ছে।
কেনেহো

2

পোস্টম্যান নিয়ে আমার এই সমস্যা ছিল the এটি শিরোনামগুলিতে যুক্ত করুন ... এখানে চিত্র বর্ণনা লিখুন


আমার ক্ষেত্রে, আমি চেকবক্সটি নির্বাচন করিনি ... :) ধন্যবাদ, এটি আমাকে ক্লু দিয়েছে
লক্ষ্মীকান্ত

1

যেহেতু এটি সেশন লগইন তাই আপনার শংসাপত্র সরবরাহ করতে হবে তাই 127.0.0:8000/admin অ্যাডমিন করুন এবং পরে লগইন করুন এটি কার্যকর হবে


4
দুঃখিত, তবে এই প্রশ্নের উত্তর ইতিমধ্যে আপনার চেয়ে আরও বিশদে জবাব দেওয়া হয়েছে ...
মুহাম্মদ দাস ইয়াসকুর

এটি এমন লোকদের জন্য যার দ্রুত সমাধান প্রয়োজন
--শ্বরিয়া কাবাডি

1

সম্ভবত এটি কাজ করতে পারে

Settings.py এ

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ডিফল্টভাবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.