web-dev-qa-db-fra.com

Activer le jeton porteur dans Swashbuckle (document Swagger)

J'ai créé une application asp.net webapi qui utilise Individual Account Security afin que le jeton de support soit activé par défaut. Cela fonctionne très bien pour que je puisse les tester sans problème dans Postman.

Voici la question lorsque j'essaie d'intégrer l'interface utilisateur Swagger de Swashbuckle. J'ai installé le Swashbuckle de:

Swashbuckle du paquet d'installation

Puis changez le SwaggerConfig.cs:

GlobalConfiguration.Configuration
    .EnableSwagger(c =>
    {
        c.ApiKey("Token")
            .Description("Filling bearer token here")
            .Name("Authorization")
            .In("header");
    }
    .EnableSwaggerUi(c =>
    {
        c.EnableApiKeySupport("Authorization", "header");
    };

Commencer mon application et remplir le jeton porteur:

 enter image description here

Mais cela ne fonctionne pas lorsque je lance la requête api qui nécessite une autorisation. Voici la capture d'écran:

 enter image description here

Le jeton porteur est ajouté à Authorization dans l'en-tête. Mais j'ai toujours l'erreur 401. Je me demande si c'est parce que le jeton est codé (le SPACE est remplacé par% 20)? Une idée? Merci.

En passant, je me demande comment ajouter le jeton / dans mon document Swagger afin que je puisse obtenir le jeton dans l'interface utilisateur Swagger.

29
Bagusflyer

Mettre à jour

Le problème détaillé ci-dessous est maintenant résolu dans Swashbuckle v5.5.0 .

Problème

Je viens de rencontrer exactement le même problème. Je pense que la cause fondamentale est cette ligne dans le code source de Swashbuckle :

var key = encodeURIComponent($('#input_apiKey')[0].value);

C'est ici que la valeur du champ de saisie HTML passe par le codage d'URL, transformant ainsi l'espace en %20. Je prévois d’ouvrir un problème dans le repo Swashbuckle sur GitHub .

Workaround

En attendant que ce problème soit résolu, voici une solution de contournement consistant à remplacer la ligne ci-dessus à l'aide d'un fichier Javascript injecté dans l'interface utilisateur de Swagger:

  1. Dans le projet où vous avez installé Swashbuckle, créez un nouveau dossier et appelez-le "Swagger".

  2. Dans le nouveau dossier, créez un nouveau fichier Javascript appelé "SwaggerUiCustomization.js" et insérez-y ce script: 

    (function () {
        function addApiKeyAuthorization() {
            var key = $('#input_apiKey')[0].value;
            if (key && key.trim() != "") {
                var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization(swashbuckleConfig.apiKeyName, key, swashbuckleConfig.apiKeyIn);
                window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth);
                log("added key " + key);
            }
        }
        $('#input_apiKey').change(addApiKeyAuthorization);
    })();
    
  3. Dans l'explorateur de solutions, choisissez le fichier et appuyez sur Alt + Entrée pour modifier ses propriétés Propriétés. Dans la fenêtre Propriétés, remplacez le fichier Action de compilation par Ressources incorporées

  4. Dans votre fichier SwaggerConfig.cs, ajoutez la ligne suivante dans le bloc de code EnableSwaggerUi(): c.InjectJavaScript(thisAssembly, "<Project_Default_Namespace>.Swagger.SwaggerUiCustomization.js");
    Assurez-vous bien sûr de remplacer <Project_Default_Namespace> par l’espace de noms par défaut de votre projet. 

  5. Exécutez votre projet et entrez "Bearer" dans la zone de texte. Lorsque vous appelez une action de contrôleur, vous devez obtenir exactement la même valeur, avec un espace au lieu de %20%, côté serveur.

18
urig

Remarque: cet exemple utilise des jetons Web Json.

Votre code peut être configuré pour que "Bearer" ne soit pas requis dans la chaîne d'autorisation.

Code dans le projet WebApi pour récupérer le jeton (voir token = ... dans le segment de code ci-dessous):

private static bool TryRetrieveToken(HttpRequestMessage request, out string token)
    {
        token = null;
        IEnumerable<string> authzHeaders;
        if (!request.Headers.TryGetValues("Authorization", out authzHeaders) || authzHeaders.Count() > 1)
        {
            return false;
        }
        var bearerToken = authzHeaders.ElementAt(0);
        token = bearerToken.StartsWith("Bearer ") ? bearerToken.Substring(7) : bearerToken;
        return true;
    }

Swagger ApiKey:

c.ApiKey("Authorization")
                        .Description("Filling bearer token here")
                        .Name("Bearer")
                        .In("header");

Swagger Enable ApiKey Support:

c.EnableApiKeySupport("Authorization", "header");

Collage de jeton dans l'élément de formulaire Api_Key dans l'interface utilisateur Swagger:  enter image description here

À quoi cela ressemble dans l’en-tête de la demande dans Swagger:  enter image description here

2
Jeremy Ray Brown