我正在使用两个很棒的工具DRF和Django-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命令手动测试它...
如果您正在使用令牌身份验证,则可能需要查看this question
基本上,你只需要将它添加到你的settings.py
:
SWAGGER_SETTINGS = {
'SECURITY_DEFINITIONS': {
'api_key': {
'type': 'apiKey',
'in': 'header',
'name': 'Authorization'
}
},
}
在Swagger UI页面中,您应该看到“授权”按钮。单击该按钮,然后在输入文本字段中输入您的授权值。
自从我开始工作以后,我自己回答。
实际上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所需的视图:-)
我的问题是,在激活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'
)
}
架构视图需要具有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
。似乎无法改善这一点,如果我这样做会更新这篇文章。
如果你用django-rest-swagger == 2.2.0实现@Melvic Ybanez的答案仍然无效。降级为django-rest-swagger == 2.1.2。按钮授权现在应该工作。
我设法通过此配置将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
只是添加到你休息框架设置SessionAuthentication应该在顶部
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'mymodule.authentication.CustomeAuthentication',
)
注意:SessionAuthentication将使用您的Django登录会话
CustomeAuthentication将用于实际用例的rest api。