web-dev-qa-db-ja.com

Django Rest Framework-認証資格情報が提供されませんでした

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."}
70
Marcos Aguayo

Settings.pyに「DEFAULT_AUTHENTICATION_CLASSES」を追加して解決しました

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

Mod_wsgiを使用してApacheでDjangoを実行している場合は、追加する必要があります

WSGIPassAuthorization On

httpd.confで。そうでない場合、mod_wsgiによって認証ヘッダーが削除されます。

125
Robert Kovac

これは、settings.pyに「DEFAULT_PERMISSION_CLASSES」なしで役立ちます。

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

同じエラーでここに着く他の人たちのために、あなたのrequest.userAnonymousUserであり、実際にURLへのアクセスを許可されている正しいユーザーではない場合、この問題が発生します。 request.userの値を出力することでそれを見ることができます。それが実際に匿名ユーザーである場合、これらのステップは役立つかもしれません:

  1. 'rest_framework.authtoken'INSTALLED_APPSsettings.pyがあることを確認してください。

  2. これがsettings.pyのどこかにあることを確認してください:

    REST_FRAMEWORK = {
    
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.TokenAuthentication',
            # ...
        ),
    
        # ...
    }
    
  3. ログインしているユーザーの正しいトークンを持っていることを確認してください。トークンを持っていない場合は、トークンを取得する方法を学んでください here 。基本的に、正しいユーザー名とパスワードを入力すると、トークンを提供するビューに対して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"
12
sherelock

コマンドラインで(curlや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"

または Advanced Rest Client(ARC) のような何か

8
lukeaus

私も追加を逃したので、私も同じに直面しました

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ファイルのAuthenticationについてDjangoを明示的に指定する必要があります。

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

Settings.pyにSessionAuthenticationを追加すると、仕事ができます

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

2
Pritam Roy