comment ajouter un jeton d'authentification à swagger + django repos cadre?

je suis à l'aide de deux outils très efficaces DRF et Django-REST-Swagger, cependant quelques vues de mon API sont sous authentification token.

alors maintenant j'aimerais ajouter à ma page swagger doc de mon API la possibilité de tester les urls de l'api token auth, y compris l'en-tête Token. Comment pourrais-je faire cela?.

un instantané de la vue de l'API de classe est comme ceci:

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

depuis Swagger auto détecte beaucoup de choses, je m'attendais à remarquer A propos de token auth, et demandez-moi à propos de token ou de user id dans son interface web, mais ce n'est pas le cas. C'est pourquoi je le teste manuellement par des commandes CURL...

18
demandé sur miguelfg 2014-07-21 16:17:42

5 réponses

si vous utilisez l'authentification par jeton, vous devriez regarder cette question

en gros, vous avez juste besoin d'ajouter ceci à votre settings.py:

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

dans votre page Swagger UI vous devriez voir un Autoriser bouton. Cliquez sur et entrez votre l'Autorisation valeur dans le champ de saisie de texte.

21
répondu Melvic Ybanez 2017-05-23 10:31:33

je me réponds depuis que je l'ai fait marcher.

en fait, Swagger settings a une option pour cela, 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
}

pour moi ce n'était pas si clair, mais je viens d'entrer un token valide pour tester l'utilisateur et cela a fonctionné pour les vues nécessaires auth : -)

10
répondu miguelfg 2014-07-21 15:28:50

mon problème était qu'après avoir activé TokenAuthentification, les urls de mon api n'étaient plus affichées dans l'interface swagger à cause d'une Authentiationerror.

Pour moi, la solution a été d'activer les deux classes authentaction dans les réglages du cadre de repos de Django:

SessionAuthentification -> pour le Style de l'INTERFACE utilisateur

TokenAuthentification - > pour les autres Clients

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

}

5
répondu matyas 2016-12-02 11:01:06

la vue schema doit avoir la permission de AllowAny. Cela permet au plugin de voir quels endpoints sont disponibles avant l'authentification de l'utilisateur. Les points terminaux doivent toujours être protégés s'ils sont correctement configurés. Exemple:

@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))

il est préférable de supprimer L'authentification de session et n'utiliser que le TokenAuthentication mais c'est une question de choix, ici je l'ai supprimé

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated'
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication'
)

assurez-vous ajouter 'rest_framework.authtoken' dans vos applications installées et de supprimer les CsrfViewMiddleware des classes middleware car il ne sera plus nécessaire. Et l'arrogance des paramètres

SWAGGER_SETTINGS = {
    'SECURITY_DEFINITIONS': {
        'api_key': {
            'type': 'apiKey',
            'in': 'header',
            'name': 'Authorization'
        }
    },
    'USE_SESSION_AUTH': False,
    'JSON_EDITOR': True,
}

cela permettra à swagger de remplir le jeton dans toutes les commandes curl de l'exemple, ce qui est vraiment agréable à avoir. Laisser la session auth en place semble la désactiver.

la boîte de dialogue autorisation swagger demande api_key qui doit être fourni. Ne pouvez pas améliorer ce programme, permettra de mettre à jour ce post si je ne.

5
répondu oden 2017-04-10 06:25:07

si vous mettez en œuvre la réponse de @Melvic Ybanez et ne fonctionne toujours pas. et vous utilisez django-reste-swagger==2.2.0 revenir à django-reste-swagger==2.1.2. bouton Autoriser doit fonctionner maintenant.

0
répondu Diego Puente 2018-10-04 06:16:24