Django Rest Framework - Kimlik doğrulama kimlik bilgileri sağlanmadı


106

Django Rest Framework kullanarak bir API geliştiriyorum. Bir "Sipariş" nesnesi listelemeye veya oluşturmaya çalışıyorum, ancak konsola erişmeye çalıştığımda bana şu hatayı veriyor:

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

Görüntüleme:

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

Serileştirici:

class OrderSerializer(serializers.HyperlinkedModelSerializer):

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

Ve URL'lerim:

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

Ve sonra konsolda şu komutu kullanıyorum:

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

Ve hata diyor ki:

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

5
Bunu deneyin:curl -H "Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55" http://127.0.0.1:8000/api/orders/
kor

1
Aynı hata. Kimlik doğrulama bilgileri sağlanmadı
Marcos Aguayo

Benim durumumda bu, bir takım arkadaşının kullanıcıyı devre dışı moda geçirmesi nedeniyle oldu.
Brock

Önce Kimlik Doğrulamayı okumayı deneyin .
sonsuz

@endless Soru 3 yıl önceydi. Zaten çözüldü
Marcos Aguayo

Yanıtlar:


169

Mod_wsgi kullanarak Apache üzerinde Django çalıştırıyorsanız, eklemeniz gerekir

WSGIPassAuthorization On

httpd.conf dosyanızda. Aksi takdirde, yetkilendirme başlığı mod_wsgi tarafından çıkarılır.


1
Bunu nereye yazacağınızı merak ediyorsanız, bağlantıyı takip edin. stackoverflow.com/questions/49340534/…
user2858738

2
ubuntu için hayır gibi görünüyor httpd.conf. böylece eklemek zorunda WSGIPassAuthorization Oniçinde/etc/apache2/apache2.conf
suhailvs

Postacı'dan gelen isteklerimin yerel ana bilgisayarımdan çalıştığı, ancak canlı sunucuya gönderildiğinde çalışmadığı bir sorunla kafam karıştı. Yorumunuz sorunumu çözdü.
RommelTJ

Çözüldü Sorunum, localhost'umdaki api aracılığıyla veri alabildim, ancak sunucuya https: // üzerinden konuşlandırıldığında bana aynı hatayı veriyordu.
Mir Suhail

Bu sadece üretim için mi yoksa yerel kalkınma için de geçerli mi?
MadPhysicist

100

Ayarlarıma "DEFAULT_AUTHENTICATION_CLASSES" eklenerek çözüldü.py

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

Düşünce Bunu yaptım, ama ekledi vardı 'rest_framework.authentication.TokenAuthentication'için DEFAULT_PERMISSION_CLASSESyerineDEFAULT_AUTHENTICATION_CLASSES
netigger

4
Bu çözüm için teşekkürler! Ancak neden "Kimlik doğrulama kimlik bilgileri sağlanmadı" ı alamadığımı anlamıyorum. Ben ise hata, Postman ile isteğinde bulunurken yaptığı benim Açısal müşteri istekleri yaptığında hatası alıyorum. İkisi de Yetkilendirme başlığında aynı
jetonla

SessionAuthenticationvarsayılan olarak etkindir ve standart oturum tanımlama bilgileriyle çalışır, bu nedenle Angular (veya diğer JS çerçevesi) uygulamanız varsayılan oturum kimlik doğrulaması nedeniyle çalışıyor olabilir.
Kevin Brown

29

Bu, ayarlarımda "DEFAULT_PERMISSION_CLASSES" olmadan bana yardımcı olur.py

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

3
Bunu SessionAuthenticationbenim için
düzelten

Benim için de düzeltildi. Bu konudaki Django dersinin neden bundan bahsetmediğini merak ediyorum. Django-rest-framework.org/tutorial/quickstart adresine bakın .
Nick T

15

Eğer senin Tıpkı diğer insanlar aynı hata ile burada iniş için, bu sorun ortaya çıkabilir request.userolduğu AnonymousUseraslında URL'ye erişim yetkilidir doğru kullanıcıyı değil. Değerini yazdırarak görebilirsiniz request.user. Gerçekten anonim bir kullanıcıysa, aşağıdaki adımlar yardımcı olabilir:

  1. Olmasına dikkat edin 'rest_framework.authtoken'de INSTALLED_APPSsenin içinde settings.py.

  2. Bunun bir yerde olduğundan emin olun settings.py:

    REST_FRAMEWORK = {
    
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.TokenAuthentication',
            # ...
        ),
    
        # ...
    }
    
  3. Giriş yapan kullanıcı için doğru jetona sahip olduğunuzdan emin olun. Jetonunuz yoksa, onu nasıl alacağınızı buradan öğrenin . Temel olarak, POSTdoğru kullanıcı adı ve şifreyi sağlarsanız size jetonu veren bir görünüm için talepte bulunmanız gerekir . Misal:

    curl -X POST -d "user=Pepe&password=aaaa"  http://localhost:8000/
    
  4. Erişmeye çalıştığınız görünümün şunlara sahip olduğundan emin olun:

    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Şimdi şu şekilde kullanın :

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

Misal:

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

Nasıl yazdırılır request.user? Görünüşe göre sınıf tabanlı bir görünümün POST yöntemi hiçbir zaman işlenmiyor. Kullanıcıyı başka nerede yazdırmayı deneyebilirim?
MadPhysicist

istek nesnesinde ayarlanabilmesi için kullanıcının kimliğinin doğrulanması gerekir. Aksi takdirde, yalnızca anonim kullanıcıyı yazdırır. Kullanıcınızın kimliğini nasıl doğruluyorsunuz?
sherelock

12

Komut satırında oynuyorsanız (curl veya HTTPie vb. Kullanarak) API'nizi test etmek / kullanmak için BasicAuthentication kullanabilirsiniz.

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

Daha sonra curl kullanabilirsiniz

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

veya httpie (gözler için daha kolay):

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

veya Advanced Rest Client (ARC) gibi başka bir şey


9

Ben de eklemeyi özlediğimden beri aynı şeyle karşılaştım

authentication_classes = (TokenAuthentication)

API görünüm sınıfımda.

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

Yukarıdakilere ek olarak, Django'ya settings.py dosyasındaki Kimlik Doğrulamayı açıkça söylememiz gerekir .

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

3

Settings.py içinde SessionAuthentication eklemek işi yapar

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


3

Benim için Yetkilendirme başlığımı Django DRF'de "Taşıyıcı" veya "Token" yerine "JWT" ​​ile eklemek zorunda kaldım. Sonra çalışmaya başladı. Örneğin -

Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh


Burada aynı. Next.JS'yi arka uç olarak Django DRF ile kullanma.
kenneho

2

Postacı ile bu sorunu yaşıyordum, bunu başlıklara ekle ... görüntü açıklamasını buraya girin


Benim durumumda, onay kutusunu seçmemiştim ... :) Teşekkürler, bu bana ipucu verdi
Laxmikant

1

Oturum Oturum Açma olduğu için, size kimlik bilgileri sağlamanız gerekir, böylece 127.0.0:8000/admin yönetici ve daha sonra oturum açma iyi çalışacaktır


1
Üzgünüz, ama bu soru zaten sizinkinden daha ayrıntılı olarak cevaplandı ...
Muhammed Dyas Yaskur

Bu, hızlı çözüme ihtiyaç duyan insanlar için
Aishwarya kabadi

1

Muhtemelen bu işe yarayabilir

Settings.py içinde

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

Bunu da ekle

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

0

Eğer kullanıyorsanız , modelde authentication_classesolduğu is_activegibi sahip olmalısınız , bu varsayılan olarak olabilir .TrueUserFalse

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.