Django Rest Framework-認証資格情報が提供されていません


98

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年

私の場合、これはチームメイトがユーザーを非アクティブモードに切り替えたために発生しました。
ブロック

最初に認証を読んでみてください。
エンドレスの

@endless問題は3年前です。すでに解決
Marcos Aguayo

回答:


159

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

WSGIPassAuthorization On

あなたのhttpd.confで。それ以外の場合、承認ヘッダーはmod_wsgiによって削除されます。


1
これをどこに書けばよいかわからない場合は、リンクをクリックしてください。stackoverflow.com/questions/49340534/…–
user2858738

1
ubuntuにはないようhttpd.confです。あなたが追加する必要がありそうWSGIPassAuthorization On/etc/apache2/apache2.conf
suhailvs

Postmanからのリクエストが私のローカルホストからは機能しているが、ライブサーバーに送信されたときは機能しないという問題に困惑しました。あなたのコメントは私の問題を解決しました。
RommelTJ

私の問題を解決しました。ローカルホストでAPIを介してデータを取得できましたが、https://経由でサーバーにデプロイすると、同じエラーが発生しました。
Mir Suhail

これは本番環境でのみ、またはローカル開発でも当てはまりますか?
MadPhysicist

93

「DEFAULT_AUTHENTICATION_CLASSES」を私のsettings.pyに追加することで解決しました

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
この解決策をありがとう!「認証情報が提供されなかった」の理由がわかりません。エラー私は一方で、ポストマンとの要求を行うときでした私の角度クライアントが要求をした時にエラーが発生します。Authorizationヘッダーに同じトークンが含まれている...
Sander Vanden Hautte

SessionAuthenticationはデフォルトで有効になっており、標準のセッションCookieで動作するため、デフォルトのセッション認証が原因で、Angular(または他のJSフレームワーク)アプリケーションが機能していた可能性があります。
ケビンブラウン

27

これは私の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

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

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

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



1

私にとっては、Authorizationヘッダーの前に、Django DRFの「Bearer」または「Token」ではなく「JWT」を付ける必要がありました。それからそれは働き始めました。例-

Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh


0

使用している場合は、モデルと同じようにauthentication_classesする必要があります。これはデフォルトである場合があります。is_activeTrueUserFalse

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.