Как добавить токен 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 для реального случая использования.