web-dev-qa-db-fra.com

comment ajouter l'authentification de jeton au cadre de repos swagger + Django?

J'utilise à la fois d'excellents outils DRF et Django-REST-Swagger , mais quelques-unes de mes vues API sont sous authentification par jeton.

Alors maintenant, j'aimerais ajouter à ma page de documentation swagger de mon API la possibilité de tester ces URL d'api d'authentification de jeton, y compris l'en-tête Token. Comment pourrais-je faire cela?.

Voici un aperçu de la vue API de ma classe:

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

Depuis que Swagger auto détecte beaucoup de choses, je m'attendais à remarquer à propos de l'authentification de jeton, et à me demander à propos du jeton ou de l'ID utilisateur dans son interface Web, mais ce n'est pas le cas. Par conséquent, je le teste manuellement via les commandes CURL ...

18
miguelfg

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

En fait, les paramètres Swagger ont 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 de saisir un jeton valide pour tester l'utilisateur et cela a fonctionné pour les vues dont vous aviez besoin :-) 

10
miguelfg

Si vous utilisez l'authentification par jeton, vous voudrez peut-être examiner cette question

En gros, il vous suffit d’ajouter ceci à votre settings.py:

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

Dans votre page d’interface utilisateur Swagger, vous devriez voir un bouton Authorize . Cliquez dessus et entrez votre Autorisation dans le champ de saisie.

21
Melvic Ybanez

Mon problème était qu'après avoir activé l'authentification TokenAut, les URL de mes api n'étaient plus affichées dans l'interface utilisateur swagger en raison d'une erreur AuthentificationError. 
Pour moi, la solution consistait à activer les deux classes d'authentification dans les paramètres de Django Rest Framework:
SessionAuthentification -> pour l'interface utilisateur Swagger
TokenAut authentification -> pour les clients restants 

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

}

6
matyas

La vue de schéma doit avoir l'autorisation de AllowAny. Cela permet au plug-in de voir quels points de terminaison sont disponibles avant que l'utilisateur ne s'authentifie. Les points de fin doivent toujours être protégés s'ils sont configurés correctement. 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 SessionAuthentication et d’utiliser uniquement 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 d’ajouter 'rest_framework.authtoken' dans vos applications installées et de supprimer la CsrfViewMiddleware des classes de l’intergiciel car elle ne sera plus nécessaire. Et les paramètres de swagger

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

Cela permettra à swagger de renseigner le jeton dans tous les exemples de commandes curl, ce qui est vraiment agréable à avoir. Laisser l'authentification de session en place semble le désactiver.

La boîte de dialogue d'autorisation swagger demande le api_key qui doit être fourni. Vous ne pouvez pas sembler améliorer cela, mettra à jour ce post si je le fais.

5
oden

Je parviens à changer l'authentification de base par défaut de Swagger en authentification par jeton avec cette configuration, mais lorsque vous essayez, le bouton est enfoncé, swagger accepte toute authentification indépendamment du jeton valide.

Notez également que lorsque j'ai ajouté SessionAuthentication à mon REST_FRAMEWORK dans le fichier settings.py, mon api n'a pas pu être affichée sur les documents 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'
        }
    },
}

une documentation utile https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#security-definitions-object

0

si vous implémentez la réponse de @Melvic Ybanez et que cela ne fonctionne toujours pas. et que vous utilisez Django-rest-swagger == 2.2.0 et rétrogradez vers Django-rest-swagger == 2.1.2. bouton Autoriser doit fonctionner maintenant.

0
Diego Puente