Учетные данные аутентификации администратора Django не предоставлены - HTTP 401 - PullRequest
0 голосов
/ 03 ноября 2018

Мое приложение Django не распознает учетные данные в панели администратора для некоторых моделей. Я могу войти, просмотреть часть моделей, но для некоторых других я вижу следующее сообщение об ошибке:

{"detail":"Authentication credentials were not provided."}

Интересно: есть модели, которые я вижу, но когда я нажимаю «Добавить», чтобы добавить запись, я вижу сообщение об ошибке.

Среди прочего я использую следующие библиотеки:

Django==2.0.9
django-cors-headers==2.4.0
django-extensions==2.1.3
django-storages==1.7.1
djangorestframework==3.8.2
djangorestframework-jwt==1.11.0

В моем settings.py у меня есть следующее:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'corsheaders',
    'django_extensions',
    'storages',

    'rest_framework',

    'authentication.apps.AuthenticationConfig',
    'directory.apps.DirectoryConfig',
    'metacontent.apps.MetacontentConfig',
]

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

    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
]

, а также:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        #'rest_framework.permissions.IsAuthenticated', #removed for open docs access
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 100,
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '1000/hour',
        'user': '6000/hour',
    },
}

Когда запрос НЕ работает, заголовки ответа следующие:

HTTP/1.1 401 Unauthorized
Date: Fri, 02 Nov 2018 21:50:27 GMT
Server: Apache/2.4.34 (Amazon) mod_wsgi/3.5 Python/3.6.5
Allow: GET, HEAD, OPTIONS
Vary: Origin
X-Frame-Options: SAMEORIGIN
WWW-Authenticate: JWT realm="api"
Content-Length: 58
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json

А когда он работает:

HTTP/1.1 200 OK
Date: Fri, 02 Nov 2018 21:50:28 GMT
Server: Apache/2.4.34 (Amazon) mod_wsgi/3.5 Python/3.6.5
Expires: Fri, 02 Nov 2018 21:50:29 GMT
Cache-Control: max-age=0, no-cache, no-store, must-revalidate
Vary: Cookie,Origin
X-Frame-Options: SAMEORIGIN
Set-Cookie: csrftoken=8Aw8toVirE5qLSt79Nhh5tDem59qLChCrZ3i7zKkLo2NzS1UZ37SVDpjl; expires=Fri, 01-Nov-2019 21:50:29 GMT; Max-Age=31449600; Path=/
Content-Length: 3876
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

Я думал о «WSGIPassAuthorization On», но если бы это было проблемой, это никогда бы не сработало. Кроме того, у меня есть проблема как на локальном хосте (Mac), так и на сервере (Apache с включенным WSGIPassAuthorization). Что мне не хватает? Ваша помощь будет высоко ценится.

1 Ответ

0 голосов
/ 04 ноября 2018

Решение было на самом деле довольно простым. У меня был зарегистрирован URL-адрес как таковой:

router = DefaultRouter()
router.register(r'mymodel', views.MymodelViewSet, base_name='mymodel')

Но поскольку в начале не было ^, регулярное выражение страницы администратора пыталось вызвать зарегистрированный URL, а не созданный администратором URL. Поэтому решение было просто добавить ^:

router = DefaultRouter()
router.register(r'^mymodel', views.MymodelViewSet, base_name='mymodel')
...