Django DRF получает недостающие заголовки аутентификации с помощью JWT, но с разрешением и аутентификацией для представлений ReadOnly - PullRequest
0 голосов
/ 02 февраля 2020

Я работаю как с самой последней Django 3.0.2, так и с DRF 3.11.0, используя djangorestframework-simplejwt 4.4.0. У меня не было этой проблемы раньше в предыдущем проекте Django 2.2.0 (и более старых версиях lib), но я не могу понять, почему я не могу получить доступ к представлению с установленными разрешениями только для чтения, и аутентификация по умолчанию выглядит нормально в настройках. Для библиотеки simplejwt и firebaseauth я использую настройки по умолчанию (с правильными учетными данными для firebaseauth, проверил, что он работает нормально).

Если я указал в качестве пустого в аутентификации классы authentication_classes, то он работает нормально, но это всего лишь пример. Я ожидал, что настройки по умолчанию будут работать из настроек: если я не прав и должен быть явно установлен таким образом. Я также пытался использовать gunicorn и официантку, и это тот же результат.

Вот вид:

class NoteList(generics.ListAPIView):
"""
List all Notes. Not used
"""
# authentication_classes = []
permission_classes = (permissions.AllowAny,)
serializer_class = NoteSerializer

def get_queryset(self):
    notes = Note.objects.all()
    return notes

Вот мои настройки:

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', ]


REST_FRAMEWORK = {
# When you enable API versioning, the request.version attribute will contain a string
# that corresponds to the version requested in the incoming client request.
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning',

# Authentication settings
'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework_simplejwt.authentication.JWTAuthentication',
    'rest_framework.authentication.SessionAuthentication',
    'drf_firebase_auth.authentication.FirebaseAuthentication',
],

# Permission settings
'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
    'rest_framework.permissions.IsAuthenticated',
    'rest_framework.permissions.IsAdminUser',
    'rest_framework.permissions.IsAuthenticatedOrReadOnly',
],

# For unit test cases
'TEST_REQUEST_DEFAULT_FORMAT': 'json',

# Pagination
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 50,

}

Если порядок перечисленных выше вопросов имеет значение, каков их правильный порядок?

URL, если он имеет значение:

urlpatterns = [
path('anotes/', NoteList.as_view(), name="lame-notes"),

]

Теперь, когда я посещаю URL-адрес анонимно, я всегда получаю:

GET /v1/anotes/

HTTP 401 Unauthorized
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
WWW-Authenticate: Bearer realm="api"

{
    "detail": "Invalid Authorization header format, expecting: JWT <token>."

Я застрял в этой проблеме некоторое время и не смог найти каких-либо подобных проблем для ее решения. В моем старом Django проекте я не получаю 401 Unauthorized и могу работать с ReadOnly корректно. Представление или конечная точка работает правильно только в том случае, если я вошел в систему.

Если мне не хватает какой-либо информации, сообщите мне.

1 Ответ

0 голосов
/ 02 февраля 2020

Разрешения в среде REST всегда определяются как список классов разрешений. Перед запуском основного тела представления проверяется каждое разрешение в списке. Если при какой-либо проверке разрешения не выполняется исключение. Исключение. Пропуск или исключение. Исключение не будет подтверждено, и основная часть представления не будет запущена. Таким образом, анонимный пользователь может проверить первый элемент в вашем списке разрешений, но потерпит неудачу на втором. Вы должны решить, каким будет ваше поведение по умолчанию, и сохранить это в списке.

...