framework - swagger documentation example django
¿Cómo agregar token auth a swagger+django rest framework? (6)
La vista de esquema necesita tener el permiso de AllowAny. Esto permite que el complemento vea qué puntos finales están disponibles antes de que el usuario se haya autenticado. Los puntos finales aún deben estar protegidos si están configurados correctamente. Ejemplo:
@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))
Es mejor eliminar la SessionAuthentication y solo usar la TokenAuthentication, pero es una cuestión de elección, aquí la he eliminado
REST_FRAMEWORK = {
''DEFAULT_PERMISSION_CLASSES'': [
''rest_framework.permissions.IsAuthenticated''
''DEFAULT_AUTHENTICATION_CLASSES'': (
''rest_framework.authentication.TokenAuthentication''
)
Asegúrese de que agregue ''rest_framework.authtoken''
a sus aplicaciones instaladas y elimine el CsrfViewMiddleware
de las clases de middleware ya que ya no será necesario. Y los ajustes de Swagger.
SWAGGER_SETTINGS = {
''SECURITY_DEFINITIONS'': {
''api_key'': {
''type'': ''apiKey'',
''in'': ''header'',
''name'': ''Authorization''
}
},
''USE_SESSION_AUTH'': False,
''JSON_EDITOR'': True,
}
Esto hará que Swagger rellene el token en todos los comandos de curl de ejemplo, lo que es realmente bueno tener. Dejar la autenticación de sesión en su lugar parece deshabilitar esto.
El diálogo de autorización de api_key
solicita la api_key
que se debe proporcionar. No puedo parecer mejorar esto, actualizaré este post si lo hago.
Estoy usando ambas herramientas geniales DRF y Django-REST-Swagger , sin embargo, algunas de mis vistas API están bajo autenticación de token.
Así que ahora me gustaría agregar a mi página de documentos Swagger de mi API la posibilidad de probar esas URLs de api de autenticación de token, incluido el encabezado del token. ¿Cómo podría hacer esto?.
Una instantánea de mi vista de API de clase es así:
class BookList(APIView):
"""
List all books, or create a new book.
"""
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAuthenticated,)
...
Dado que Swagger detecta automáticamente muchas cosas, esperaba saber sobre la autenticación del token y preguntarme sobre el token o la identificación del usuario en su interfaz web, pero no es así. Por lo tanto, lo estoy probando manualmente a través de comandos CURL ...
Me contesto desde que lo hice funcionar.
En realidad, la configuración de Swagger tiene una opción para esto, 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
}
Para mí no estaba tan claro, pero acabo de ingresar un token válido para probar al usuario y funcionó para las vistas de autenticación necesarias :-)
Me las arreglo para cambiar la autenticación básica predeterminada de Swagger a la autenticación de token con esta configuración, pero cuando se presiona el botón Inténtelo, resto acepta la autenticación sin importar el token válido.
También tenga en cuenta que cuando agregué SessionAuthentication a mi REST_FRAMEWORK en mi settings.py, mi api no se pudo mostrar en los documentos de 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''
}
},
}
alguna documentación útil https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#security-definitions-object
Mi problema era que, después de activar TokenAuthentification, mis APIs no se mostraban más en la interfaz de usuario de Swagger debido a un error de Authentification.
Para mí, la solución fue activar ambas clases de autenticación en la Configuración del marco de descanso de Django:
SessionAuthentification -> para la interfaz de usuario Swagger
TokenAuthentification -> para los Clientes Restantes
REST_FRAMEWORK = {
''DEFAULT_PERMISSION_CLASSES'': (''rest_framework.permissions.IsAdminUser'',),
''DEFAULT_AUTHENTICATION_CLASSES'': (
''rest_framework.authentication.TokenAuthentication'',
''rest_framework.authentication.SessionAuthentication''
)
}
Si está utilizando la autenticación de token, es posible que desee ver esta pregunta
Básicamente, solo necesitas agregar esto a tu settings.py
:
SWAGGER_SETTINGS = {
''SECURITY_DEFINITIONS'': {
''api_key'': {
''type'': ''apiKey'',
''in'': ''header'',
''name'': ''Authorization''
}
},
}
En su página de Swagger UI debería ver un botón Autorizar . Haga clic en eso e ingrese su valor de Autorización en el campo de texto de entrada.
Si implementas la respuesta de @Melvic Ybanez y aún no funciona. y estás usando django-rest-swagger == 2.2.0 downgrade a django-rest-swagger == 2.1.2. botón Autorizar tiene que trabajar ahora.