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
익명 사용자인 경우 다음 단계를 수행하면 도움이 될 수 있습니다.
확인하십시오.
'rest_framework.authtoken'
안에INSTALLED_APPS
의 신의에settings.py
.이것을 어딘가에 가지고 있는지 확인합니다.
settings.py
:REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', # ... ), # ... }
로그인한 사용자에 대한 토큰이 올바른지 확인합니다.토큰이 없는 경우 여기에서 토큰을 가져오는 방법을 배우십시오.기본적으로, 당신은 할 필요가 있습니다.
POST
올바른 사용자 이름과 암호를 제공하는 경우 토큰을 제공하는 보기에 요청합니다.예:curl -X POST -d "user=Pepe&password=aaaa" http://localhost:8000/
액세스하려는 보기에 다음이 있는지 확인합니다.
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,) # ...
사용하다
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
그것을 겉치레로 하면서.Token
ieToken token
언급URL : https://stackoverflow.com/questions/26906630/django-rest-framework-authentication-credentials-were-not-provided
'programing' 카테고리의 다른 글
오라클 테이블에서 새 행 문자를 검색하는 방법은 무엇입니까? (0) | 2023.07.20 |
---|---|
오라클 시스템 스탬프(날짜 변경) - 밀리초 (0) | 2023.07.20 |
Windows에 Visual Studio 2022만 설치된 MySQL 8을 설치할 수 없음 (0) | 2023.07.20 |
문자열을 데이터 프레임에서 부동으로 변환 (0) | 2023.07.20 |
Oracle에 기본 키에 대한 자동 증분 기능이 없는 이유는 무엇입니까? (0) | 2023.07.20 |