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


105

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

그리고 내 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
같은 오류. 인증 자격 증명이 제공되지 않았습니다
Marcos Aguayo 2014

제 경우에는 팀원이 사용자를 비활성 모드로 전환했기 때문에 발생했습니다.
Brock

먼저 인증 을 읽어보십시오 .
끝없는

@endless 질문은 3 년 전이었습니다. 이미 해결되었습니다
Marcos Aguayo 2018

답변:


167

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

WSGIPassAuthorization On

httpd.conf에서. 그렇지 않으면 인증 헤더가 mod_wsgi에 의해 제거됩니다.


1
이 글을 어디에 써야할지 궁금하다면 링크를 따라 가세요. stackoverflow.com/questions/49340534/…
user2858738

2
우분투에는 httpd.conf. 그래서 당신은 추가 할 필요가 WSGIPassAuthorization On에서 것은/etc/apache2/apache2.conf
suhailvs

Postman의 요청이 내 로컬 호스트에서 작동하지만 라이브 서버로 전송 될 때 작동하지 않는 문제로 혼란 스러웠습니다. 귀하의 의견이 내 문제를 해결했습니다.
RommelTJ

내 문제를 해결했는데 내 로컬 호스트에서 api를 통해 데이터를 가져올 수 있었지만 https : //를 통해 서버에 배포하면 동일한 오류가 발생했습니다.
Mir Suhail

이것은 프로덕션에서만 또는 로컬 개발에도 적용됩니까?
MadPhysicist

97

내 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_CLASSESDEFAULT_AUTHENTICATION_CLASSES
netigger

4
이 솔루션에 감사드립니다! 그러나 "인증 자격 증명이 제공되지 않았습니다"를받지 못한 이유를 이해할 수 없습니다. 나는 반면에 오류가 우체부와 요청을 할 때 했던 내 각도 클라이언트가 요청을 만들 때 오류가 발생합니다. 인증 헤더에서 마찬가지로 ...와 두
샌더 반덴 Hautte

SessionAuthentication기본적으로 활성화되고 표준 세션 쿠키와 함께 작동하므로 Angular (또는 기타 JS 프레임 워크) 애플리케이션이 기본 세션 인증으로 인해 작동했을 가능성이 있습니다.
Kevin Brown

29

내 settings.py에서 "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를 참조 하세요 .
Nick T

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

요청 객체에 설정 될 수 있으려면 사용자가 인증되어야합니다. 그렇지 않으면 익명의 사용자 만 인쇄합니다. 사용자를 어떻게 인증하고 있습니까?
sherelock

11

명령 줄에서 놀고있는 경우 (컬 또는 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"

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


9

내가 추가를 놓친 이후 나도 똑같은 직면

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에게 명시 적으로 알려야 합니다.

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

3

settings.py에 SessionAuthentication을 추가하면 작업이 수행됩니다.

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


3

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

Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh


여기도 마찬가지입니다. 백엔드로 Django DRF와 함께 Next.JS 사용.
kenneho

2

우편 배달부에게이 문제가 발생했습니다. 헤더에 이것을 추가하십시오 ... 여기에 이미지 설명 입력


제 경우에는 체크 박스를 선택하지 않았습니다 ... :) 감사합니다, 이것은 나에게 단서를주었습니다
Laxmikant

1

세션 로그인이므로 자격 증명을 제공해야하므로 127.0.0:8000/admin 관리자를 수행하고 나중에 로그인하면 정상적으로 작동합니다.


1
죄송합니다.이 질문은 이미 귀하의 질문보다 더 자세히 답변되었습니다 ...
Muhammad Dyas Yaskur

이것은 빠른 솔루션이 필요한 사람들을위한 것입니다
Aishwarya kabadi

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_activeTrueUserFalse

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.