Почему я не могу увидеть кнопку авторизации в маштабе drf-spectacular?
Раньше у нас был монолит, а теперь мы переходим на microservices architecture, и вот настройки для моего drf-spectacular, но у меня нет кнопки Authorize как раньше, именно с этими настройками только вместо custom authentication было rest_framework_simplejwt.authentication.JWTAuthentication
,
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
'DEFAULT_AUTHENTICATION_CLASSES': ('custom.custom_authentication.CustomAuthentication',),
}
SPECTACULAR_SETTINGS = {
'TITLE': 'My Title',
'DESCRIPTION': 'My description',
'VERSION': '0.0.1',
'SERVE_INCLUDE_SCHEMA': False,
'SERVE_PERMISSIONS': ['rest_framework.permissions.IsAdminUser'],
'SERVE_AUTHENTICATION': [
'rest_framework.authentication.SessionAuthentication',
'custom.custom_authentication.CustomAuthentication',
],
'SWAGGER_UI_SETTINGS': {"filter": True, "persistAuthorization": True}
}
В чем может быть проблема отсутствия кнопки авторизации?
Отсутствие кнопки «Авторизация» в пользовательском интерфейсе Swagger при использовании drf-spectacular
с custom.custom_authentication.CustomAuthentication
вместо JWTAuthentication
может быть вызвано несколькими факторами, связанными с тем, как настроена аутентификация в вашем пользовательском классе аутентификации. Вот контрольный список, который поможет вам устранить неполадки:
Совместимость с пользовательскими классами аутентификации: Убедитесь, что
CustomAuthentication
правильно реализуетauthenticate_header
. Swagger нуждается в этом заголовке, чтобы вызвать приглашение к авторизации.from rest_framework.authentication import BaseAuthentication class CustomAuthentication(BaseAuthentication): def authenticate_header(self, request): return 'Bearer'
Этот метод очень важен, поскольку он сообщает Swagger, что ему следует отобразить опцию авторизации для токена Bearer.
Проверьте
SPECTACULAR_SETTINGS
на наличие схем безопасности : Посколькуdrf-spectacular
полагается на настройки OpenAPI для отображения опции авторизации, вам может потребоваться явно определить свою схему безопасности. Добавьте записьSECURITY_DEFINITIONS
для вашей пользовательской аутентификации:SPECTACULAR_SETTINGS = { 'TITLE': 'My Title', 'DESCRIPTION': 'My description', 'VERSION': '0.0.1', 'SERVE_INCLUDE_SCHEMA': False, 'SERVE_PERMISSIONS': ['rest_framework.permissions.IsAdminUser'], 'SERVE_AUTHENTICATION': [ 'rest_framework.authentication.SessionAuthentication', 'custom.custom_authentication.CustomAuthentication', ], 'SWAGGER_UI_SETTINGS': {"filter": True, "persistAuthorization": True}, 'SECURITY_DEFINITIONS': { 'CustomAuth': { 'type': 'http', 'scheme': 'bearer', 'bearerFormat': 'JWT', }, }, 'SECURITY': [{'CustomAuth': []}], # Ensures the scheme is used by default }
Эта конфигурация указывает Swagger на использование токена Bearer для авторизации.
Убедитесь, что
persistAuthorization
включен : Убедитесь, что"persistAuthorization": True
установлен в разделеSWAGGER_UI_SETTINGS
, который уже есть в вашей настройке. Эта настройка сохраняет заголовок авторизации активным при перезагрузке страницы.Перепроверьте разрешения и аутентификацию: Если вы тестируете в процессе разработки, убедитесь, что ваша пользовательская аутентификация и разрешения правильно возвращают
IsAdminUser
или любые другие разрешения, которые вам могут потребоваться.Очистите кэш и обновите пользовательский интерфейс : Иногда пользовательский интерфейс Swagger кэширует настройки, особенно во время разработки. Очистите кэш браузера и обновите страницу, чтобы изменения вступили в силу.
Эти шаги должны помочь восстановить кнопку «Авторизация» с вашим пользовательским классом аутентификации. Сообщите мне, если кнопка по-прежнему не появляется после этих изменений!