web-dev-qa-db-fra.com

Comment faire pour que Swagger envoie la clé API en tant que http au lieu de l'URL

J'utilise swagger avec servicestack mais j'obtiens une erreur 401 non autorisée de mon URL/resources car elle nécessite une clé API.

Sauf erreur, selon la documentation Je devrais définir supportHeaderParams sur true ainsi que le apiKeyName et apiKey valeur dans les paramètres JSON lors de l'initialisation de Swagger à partir de ma page html.

Je m'attendais alors à voir ma clé API dans les en-têtes de demande http, mais elle est toujours ajoutée à l'URL et non dans la collection d'en-têtes.

Voici le code qui initialise Swagger dans ma page HTML:

 window.swaggerUi = new SwaggerUi({
            discoveryUrl: "http://pathtomyservice.com/resources",
                headers: { "testheader" : "123" },
                apiKey: "123",
                apiKeyName: "Api-Key",
                dom_id:"swagger-ui-container",
                supportHeaderParams: true,
                supportedSubmitMethods: ['get', 'post', 'put', 'delete'],
                onComplete: function(swaggerApi, swaggerUi){
                    if(console) {
                        console.log("Loaded SwaggerUI");
                        console.log(swaggerApi);
                        console.log(swaggerUi);
                    }
                  $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
                },
                onFailure: function(data) {
                    if(console) {
                        console.log("Unable to Load SwaggerUI");
                        console.log(data);
                    }
                },
                docExpansion: "none"
            });

Malheureusement, je ne reçois aucun en-tête, ni "Api-Key" ni "testheader".

21
Rob Bird

Je pense que cela pourrait être un bug dans l'interface utilisateur swagger.

Comme solution de contournement, j'ai ajouté ce qui suit dans le fichier swagger index.html.

$(function () {
   $.ajaxSetup({
       beforeSend: function (jqXHR, settings) {
           jqXHR.setRequestHeader("YourApiKeyHeader", $("#input_apiKey").val());
       }
   });
});

J'espère que cela t'aides,

26
gsimoes

Dans swagger-ui 2.0 ou supérieur, c'est trivial:

https://github.com/wordnik/swagger-ui#header-parameters

// add a new ApiKeyAuthorization when the api-key changes in the ui.
$('#input_apiKey').change(function() {
  var key = $('#input_apiKey')[0].value;
  if(key && key.trim() != "") {
    window.authorizations.add("key", new ApiKeyAuthorization("api_key", key, "header"));
  }
})

Ceci est également beaucoup plus extensible et prend en charge des mécanismes d'authentification personnalisés.

20
fehguy

tu peux essayer ça

(function () {
    $(function () {
        var basicAuthUI =
                '<div class="input"><input placeholder="username" id="input_username" name="username" type="text" size="10"/></div>' +
                '<div class="input"><input placeholder="password" id="input_password" name="password" type="password" size="10"/></div>';
        $(basicAuthUI).insertBefore('#api_selector div.input:last-child');
        $("#input_apiKey").hide();

        $('#input_username').change(addAuthorization);
        $('#input_password').change(addAuthorization);
    });

    function addAuthorization() {
        SwaggerApi.supportHeaderParams = true;
        SwaggerApi.headers = {"authentication": "test"};
        var username = $('#input_username').val();
        var password = $('#input_password').val();
        if (username && username.trim() != "" && password && password.trim() != "") {
            var basicAuth = new SwaggerClient.PasswordAuthorization('basic', username, password);
            window.swaggerUi.api.clientAuthorizations.add("basicAuth", basicAuth);
            console.log("authorization added: username = " + username + ", password = " + password);
        }
    }
})();
1
Tuan Minh