programing

Django Rest Framework - 인증 자격 증명이 제공되지 않았습니다.

goodsources 2023. 7. 20. 21:54
반응형

Django Rest Framework - 인증 자격 증명이 제공되지 않았습니다.

저는 장고 레스트 프레임워크를 사용하여 API를 개발하고 있습니다."Order" 개체를 나열하거나 생성하려고 하는데 콘솔에 액세스하려고 하면 다음 오류가 나타납니다.

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

그리고 내 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."}

mod_wsgi를 사용하여 Apache에서 Django를 실행하는 경우 추가해야 합니다.

WSGIPassAuthorization On

의 신의에httpd.conf가 그지않인헤다의제해거다니에 의해 됩니다.mod_wsgi.

내 settings.py 에 "DEFAULT_AUTHENTIC_CLASES"를 추가하면 해결됩니다.

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

따라서 settings.py 에서 "DEFAULT_PERMISSION_CLASES"를 사용하지 않아도 도움이 됩니다.

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

같은 오류로 여기에 착륙하는 다른 사람들에 대해서만, 이 문제가 발생할 수 있습니다.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"

명령줄에서 (컬 또는 HTTPie 등을 사용하여) 놀고 있는 경우 기본 인증을 사용하여 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 --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"

또는 ARC(Advanced Rest Client)와 같은 다른 것.

저는 Django DRF에서 "Bearer" 또는 "Token" 대신 "JWT"로 Authorization 헤더를 추가해야 했습니다.그리고 나서 작동하기 시작했습니다. 예 -

Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh

추가하는 것을 놓쳤기 때문에 저도 같은 상황에 직면했습니다.

authentication_message = (토큰 인증)

API 보기 클래스에 있습니다.

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

위의 내용 외에도 우리는 장고에게 Authentication in settings.py 파일에 대해 명시적으로 알려야 합니다.

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

저는 우체부와 문제가 있었습니다.머리글에 추가...

이것 좀 먹어봐요, 저한테 효과가 있었어요.

settings.py 에서

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

이것도 추가합니다.

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

추가하기SessionAuthentication안에settings.py을 할 입니다.

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

에 자격 증명을 . 자격 증명을 제공해야 합니다.127.0.0:8000/admin관리자와 로그인은 나중에 잘 작동할 것입니다.

사용 중인 경우authentication_classes그렇다면 당신은 했어야 했습니다.is_active~하듯이True안에User모델, 그럴지도 있습니다.False결석으로

또한 Authorization Token / API 키가 실제로 유효한지 확인하십시오.Authentication credentials were not provided.error message는 키도 유효하지 않은 경우 API에서 반환되는 오류 메시지인 것 같습니다(잘못해서 잘못된 API 키를 사용했을 때 발생했습니다).

Full Stack React & Django [5] - Django Token Authentication - Travulse Media에서 여기에 오는 사람이 있다면 이런 것이 필요합니다.

계정/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

내 경우 토큰 인증이 누락되었습니다.

@authentication_classes([SessionAuthentication, BasicAuthentication])

아래로 변경했는데 작동했습니다.

@authentication_classes([SessionAuthentication, BasicAuthentication, TokenAuthentication])

CDN을 사용하는 경우, 가 요청을 서버로 전달할 때 CDN이 요청 헤더를 제거하지 않는지 확인합니다.

이것을 설정에 추가했습니다.py:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.IsAuthenticated',
],

}

슈퍼유저를 생성하고 다음을 사용하여 토큰을 생성했습니다.

python manage.py createsuperuser

그리고 다음을 사용하여 토큰을 만들었습니다.http://127.0.0.1:8000/admin/authtoken/tokenproxy/그리고 다른 건 아무것도 없었고 그저 효과가 있었습니다.

저는 이 오류로 인해 이상한 문제가 있었습니다.

나는 토큰을 올바르게 받았고 포스트맨에서 인증 토큰을 올바르게 전달하고 있었지만 여전히 이 오류를 받고 있었습니다.

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

인터넷으로 검색해보니 SO 질문이 많습니다.하지만 아무 것도 효과가 없었습니다.

그리고 나서 저는 포스트맨 애플리케이션을 닫고 다시 시작했습니다.나는 포스트맨이 왜 그렇게 행동하는지 전혀 몰랐습니다.

다행히 문제가 해결되었습니다 :)

저는 우체부와 장고 백엔드에서도 같은 문제가 있었습니다.사용한 적이 있습니다.Bearer token하지만 실패하기 시작했고, 수동으로 추가해야 했습니다.Authorization머리글 사용Headers그것을 겉치레로 하면서.TokenieToken token

언급URL : https://stackoverflow.com/questions/26906630/django-rest-framework-authentication-credentials-were-not-provided

반응형