Как добавить токен auth в swagger + django rest framework?

Я использую как отличные инструменты DRF, так и Django-REST-Swagger, однако некоторые из моих представлений API находятся под маркерной аутентификацией.

Итак, теперь я хотел бы добавить к моей странице dag-страницы моего API возможность протестировать те токены auth api urls, включая заголовок Token. Как я могу это сделать?

Снимок моего представления API класса выглядит следующим образом:

class BookList(APIView):
    """
    List all books, or create a new book.
    """
    authentication_classes = (TokenAuthentication, )
    permission_classes = (IsAuthenticated,)
    ...

Так как Swagger auto обнаруживает много вещей, я ожидал заметить о токенах auth и спрашивал у меня о токенах или идентификаторах пользователя в своем веб-интерфейсе, но это не так. Поэтому я тестирую его вручную с помощью команд CURL...

Ответы

Ответ 1

Я отвечаю себе, так как я сделал это.

На самом деле у настроек Swagger есть опция для этого, api_key →

SWAGGER_SETTINGS = {
    "exclude_namespaces": [], # List URL namespaces to ignore
    "api_version": '0.1',  # Specify your API version
    "api_path": "/",  # Specify the path to your API not a root level
    "enabled_methods": [  # Specify which methods to enable in Swagger UI
        'get',
        'post',
        'put',
        'patch',
        'delete'
    ],
    "api_key": '', # An API key
    "is_authenticated": False,  # Set to True to enforce user authentication,
    "is_superuser": False,  # Set to True to enforce admin only access
}

Мне это было не так понятно, но я только что ввел действительный токен для тестирования пользователя, и он работал для требуемых просмотров:-)

Ответ 2

Если вы используете аутентификацию на токене, вы можете посмотреть этот вопрос

В принципе, вам просто нужно добавить это в свой settings.py:

SWAGGER_SETTINGS = {
    'SECURITY_DEFINITIONS': {
        'api_key': {
            'type': 'apiKey',
            'in': 'header',
            'name': 'Authorization'
        }
    },
}

На странице пользовательского интерфейса Swagger вы должны увидеть кнопку авторизации. Нажмите на это и введите свое значение авторизации в текстовое поле ввода.

Ответ 3

Моя проблема заключалась в том, что после активации TokenAuthentification мои api-адреса больше не показывались в пользовательском интерфейсе swagger из-за AuthentificationError.
Для меня решение состояло в том, чтобы активировать оба класса аутентификации в настройках Django Rest Framework:
SessionAuthenification → для интерфейса Swagger
TokenAuthentification → для клиентов отдыха

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    'rest_framework.authentication.SessionAuthentication'
)

}

Ответ 4

В представлении схемы должно быть разрешено AllowAny. Это позволяет плагину видеть, какие конечные точки доступны до аутентификации пользователя. Конечные точки должны быть защищены, если они правильно настроены. Пример:

@api_view()
@renderer_classes([SwaggerUIRenderer, OpenAPIRenderer, renderers.CoreJSONRenderer])
@authentication_classes((TokenAuthentication, SessionAuthentication))
@permission_classes((AllowAny,))
def schema_view(request):
    generator = schemas.SchemaGenerator(
        title='My API end points',
        patterns=my_urls,
        url="/api/v1/")
    return response.Response(generator.get_schema(request=request))

Лучше всего удалить SessionAuthentication и использовать только TokenAuthentication, но это вопрос выбора, здесь я удалил его

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated'
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication'
)

Обязательно добавьте 'rest_framework.authtoken' в установленные приложения и удалите CsrfViewMiddleware из классов промежуточного ПО, поскольку это больше не понадобится. И настройки swagger

SWAGGER_SETTINGS = {
    'SECURITY_DEFINITIONS': {
        'api_key': {
            'type': 'apiKey',
            'in': 'header',
            'name': 'Authorization'
        }
    },
    'USE_SESSION_AUTH': False,
    'JSON_EDITOR': True,
}

Это приведет к тому, что swagger заполнит токен во всех командах curl примера, что очень приятно. Если оставить сеанс аутентификации на месте, это отключит его.

Диалог авторизации swagger запрашивает api_key, который должен быть предоставлен. Не похоже, что это улучшится, обновит этот пост, если я это сделаю.

Ответ 5

если вы реализуете ответ @Melvic Ybanez с помощью django-rest-swagger == 2.2.0 и по-прежнему не работает. Понижение до django-rest-swagger == 2.1.2. Кнопка авторизации теперь должна работать.

Ответ 6

Мне удается изменить базовую аутентификацию Swagger по умолчанию на токен-аутентификацию с этой конфигурацией, но при нажатии кнопки try me rest swagger принимает любую аутентификацию независимо от действительного токена.

Также обратите внимание, что когда я добавил SessionAuthentication в свой REST_FRAMEWORK в моем файле settings.py, мой API не отображался в документах Swagger.

django-rest-swagger == 2.2.0 djangorestframework == 3.7.7

settings.py

INSTALLED_APPS = [
    'rest_framework',
    'rest_framework_swagger',
    'rest_framework.authtoken',
]

REST_FRAMEWORK = {
    # Parser classes priority-wise for Swagger
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.JSONParser',
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ) 
}

# SWAGGER SETTINGS
SWAGGER_SETTINGS = {
    'SECURITY_DEFINITIONS': {
        'api_Key': {
            'type': 'apiKey',
            'in': 'header',
            'name': 'Token Authorization'
        }
    },
}

некоторая полезная документация https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#security-definitions-object

Ответ 7

просто добавьте к вам остальные рамки настройки SessionAuthentication должны быть наверху

'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'mymodule.authentication.CustomeAuthentication',
)

Примечание: SessionAuthentication будет использовать ваш сеанс входа в Django

CustomeAuthentication будет использоваться для остальных API для реального случая использования.