"detail": "Учетные данные для аутентификации не были предоставлены". REST-фреймворк Django, использующий бэкенд аутентификации adfs
Я работаю над проектом django, который использует django_auth_adfs (Azure Active Directory) в качестве бэкенда аутентификации. Я настроил его API-сервис с помощью rest_framework. В просматриваемых представлениях rest_framework я могу авторизоваться с помощью сеансовой аутентификации, которая требует, чтобы в моем settings.py была такая возможность:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'django_auth_adfs.rest_framework.AdfsAccessTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
При этом я могу отправлять запросы на почту, которые требуют авторизации пользователя. Но как только я меняю это на (удаление аутентификации сессии):
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'django_auth_adfs.rest_framework.AdfsAccessTokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
Я получаю ошибку http 401 unauthorized, которая означает, что он не может авторизоваться с помощью токена. Это приводит к тому, что я не могу отправлять запросы с помощью postman. Кто-нибудь знает, как я могу использовать API с помощью токенов adfs?
Вот общий вид моего файла settings.py:
Также это может быть связано с тем, что настройки Nginx не передают заголовок как обратный прокси?
Я ожидал, что django rest_framework сам справится с токенизацией, но, похоже, что-то не так настроено. Я попробовал отключить авторизацию на моих api-урлах и смог отправить get-запросы и получить правильный ответ. Но я не могу отправлять post-запросы, а также это не то, что я хочу. Я хочу, чтобы только люди из моего приложения azure (уже настроенного с помощью django_auth_adfs) могли отправлять запросы.
Проблема была в моей AUDIENCE
в AUTH_ADFS
конфигурации в settings.py
.
Она должна выглядеть так:
AUTH_ADFS = {
'AUDIENCE': f'api://{client_id}',
'CLIENT_ID': client_id,
'CLIENT_SECRET': client_secret,
'CLAIM_MAPPING': {'first_name': 'given_name',
'last_name': 'family_name',
'email': 'upn'
},
'GROUPS_CLAIM': 'roles',
'MIRROR_GROUPS': True,
'USERNAME_CLAIM': 'email',
'TENANT_ID': tenant_id,
'RELYING_PARTY_ID': client_id,
'LOGIN_EXEMPT_URLS': [
'^api', # Assuming you API is available at /api
],
}
Имеется в виду, что я пропустил api://
перед client_id