如何添加令牌auth到swagger + django休息框架?

问题描述 投票:19回答:7

我正在使用两个很棒的工具DRFDjango-REST-Swagger,但我的一些API视图是在令牌认证下。

所以现在我想在我的API的swagger doc页面中添加测试那些令牌身份验证的可能性,包括令牌头。我怎么能这样做?

我的类API视图的快照如下所示:

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

由于Swagger自动检测到很多内容,我当时希望注意到令牌身份验证,并在其网络界面中询问有关令牌或用户ID的信息,但事实并非如此。因此我通过CURL命令手动测试它...

django documentation django-rest-framework swagger
7个回答
22
投票

如果您正在使用令牌身份验证,则可能需要查看this question

基本上,你只需要将它添加到你的settings.py

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

在Swagger UI页面中,您应该看到“授权”按钮。单击该按钮,然后在输入文本字段中输入您的授权值。


10
投票

自从我开始工作以后,我自己回答。

实际上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所需的视图:-)


7
投票

我的问题是,在激活TokenAuthentification后,由于AuthentificationError,我的api url在swagger UI中不再显示。 对我来说,解决方案是激活Django Rest Framework设置中的两个认证类: SessionAuthentification - >用于Swagger UI TokenAuthentification - >为其他客户

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

}


6
投票

架构视图需要具有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命令中,这非常好。保持会话auth到位似乎禁用此功能。

招摇授权对话框要求提供需要提供的api_key。似乎无法改善这一点,如果我这样做会更新这篇文章。


1
投票

如果你用django-rest-swagger == 2.2.0实现@Melvic Ybanez的答案仍然无效。降级为django-rest-swagger == 2.1.2。按钮授权现在应该工作。


0
投票

我设法通过此配置将Swagger的默认基本身份验证更改为令牌身份验证,但是当按下try me按钮时,无论有效令牌如何,rest swagger都会接受任何身份验证。

另请注意,当我在settings.py中将SessionAuthentication添加到我的REST_FRAMEWORK时,我的api无法显示在swagger文档上。

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

settings.朋友

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
投票

只是添加到你休息框架设置SessionAuthentication应该在顶部

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

注意:SessionAuthentication将使用您的Django登录会话

CustomeAuthentication将用于实际用例的rest api。

© www.soinside.com 2019 - 2024. All rights reserved.