Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django REST Framework Swagger - Authentication Error

I followed the instructions in the docs. So here's my view:

from rest_framework.decorators import api_view, renderer_classes
from rest_framework import response, schemas
from rest_framework_swagger.renderers import OpenAPIRenderer, SwaggerUIRenderer


@api_view()
@renderer_classes([OpenAPIRenderer, SwaggerUIRenderer])
def schema_view(request):
    generator = schemas.SchemaGenerator(title='Bookings API')
    return response.Response(generator.get_schema(request=request))

And I added the following to my urls.py:

url(r'^docs/', views.schema_view),

When I went to the /docs/ page of my project, I got the following error:

401 : {"detail": "Authentication credentials were not provided."} http://127.0.0.1:8000/docs/?format=openapi

In the browser console I got this message:

Unable to Load SwaggerUI init.js (line 57)

When I set the permission_classes of my schema_view to AllowAny, I was able to view my api docs. However, I'm not sure if this is the right way of doing this. Isn't there a way to login as an admin, or any other user to view the docs. Also, how do I provide the auth tokens when viewing this in the browser? Maybe I missed something in the docs.

like image 290
Melvic Ybanez Avatar asked Sep 17 '16 13:09

Melvic Ybanez


People also ask

Can I use swagger with Django?

Allow multiple instances of Swagger UI in a single Django project. Allow rendering the OpenAPI JSON spec independently. Improved control of authentication mechanisms.

What is Restapi in Django?

Django REST framework (DRF) is a powerful and flexible toolkit for building Web APIs. Its main benefit is that it makes serialization much easier. Django REST framework is based on Django's class-based views, so it's an excellent option if you're familiar with Django.


2 Answers

I think I've found the solution.

In the settings.py, I added the following settings:

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

Then when I load the page, I just click on the Authorize button at the upper right and enter this value in the value text field:

Token <valid-token-string>

However, I still needed to set the permission class of the schema view to AllowAny. The auth token just let me switch from different users, allowing me to view different set of endpoints.

like image 86
Melvic Ybanez Avatar answered Sep 17 '22 09:09

Melvic Ybanez


Isn't there a way to login as an admin, or any other user to view the docs.

If your only use token authentication, first create tokens for your users, then access the resources by setting the header

curl -X GET http://127.0.0.1:8000/api/example/ -H 'Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'
like image 40
Windsooon Avatar answered Sep 19 '22 09:09

Windsooon