Почему я не могу увидеть кнопку авторизации в маштабе 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 может быть вызвано несколькими факторами, связанными с тем, как настроена аутентификация в вашем пользовательском классе аутентификации. Вот контрольный список, который поможет вам устранить неполадки:

  1. Совместимость с пользовательскими классами аутентификации: Убедитесь, что CustomAuthentication правильно реализует authenticate_header. Swagger нуждается в этом заголовке, чтобы вызвать приглашение к авторизации.

    from rest_framework.authentication import BaseAuthentication
    
    class CustomAuthentication(BaseAuthentication):
        def authenticate_header(self, request):
            return 'Bearer'
    

    Этот метод очень важен, поскольку он сообщает Swagger, что ему следует отобразить опцию авторизации для токена Bearer.

  2. Проверьте 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 для авторизации.

  3. Убедитесь, что persistAuthorization включен : Убедитесь, что "persistAuthorization": True установлен в разделе SWAGGER_UI_SETTINGS, который уже есть в вашей настройке. Эта настройка сохраняет заголовок авторизации активным при перезагрузке страницы.

  4. Перепроверьте разрешения и аутентификацию: Если вы тестируете в процессе разработки, убедитесь, что ваша пользовательская аутентификация и разрешения правильно возвращают IsAdminUser или любые другие разрешения, которые вам могут потребоваться.

  5. Очистите кэш и обновите пользовательский интерфейс : Иногда пользовательский интерфейс Swagger кэширует настройки, особенно во время разработки. Очистите кэш браузера и обновите страницу, чтобы изменения вступили в силу.

Эти шаги должны помочь восстановить кнопку «Авторизация» с вашим пользовательским классом аутентификации. Сообщите мне, если кнопка по-прежнему не появляется после этих изменений!

Вернуться на верх