it-swarm.xyz

как добавить токен аутентификации в Swagger + Django остальные рамки?

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

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

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

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

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

18
miguelfg

Я отвечаю сам, так как я заставил это работать.

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

SWAGGER_SETTINGS = {
    "exclude_namespaces": [], # List URL namespaces to ignore
    "api_version": '0.1',  # Specify your API's 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
}

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

10
miguelfg

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

По сути, вам просто нужно добавить это к вашему settings.py:

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

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

21
Melvic Ybanez

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

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

}

6
matyas

Представление схемы должно иметь разрешение 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_SETTINGS = {
    'SECURITY_DEFINITIONS': {
        'api_key': {
            'type': 'apiKey',
            'in': 'header',
            'name': 'Authorization'
        }
    },
    'USE_SESSION_AUTH': False,
    'JSON_EDITOR': True,
}

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

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

5
oden

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

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

Django-отдых-чванство == 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

0
Jade Dhangwattanotai

если вы реализуете ответ @Melvic Ybanez и по-прежнему не работает . и используете Django-rest-swagger == 2.2.0 понижение до Django-rest-swagger == 2.1.2 . button Авторизуйтесь, теперь надо работать.

0
Diego Puente