Comment faire pour que Swagger envoie la clé de L'API sous forme de http au lieu de l'URL

j'utilise swagger avec servicestack mais je reçois une erreur 401 non autorisée de mon URL / resources parce qu'elle nécessite une clé API.

à moins que je ne me trompe, selon la documentation je devrais set supporttheaderparams true ainsi que l' 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 mon API touche dans les en-têtes de la requête http, mais elle est toujours ajoutée à L'URL et pas dans la collection des 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 n'ai pas d'en-tête du tout, pas de 'Api-Key' ou 'testheader'.

21
demandé sur Hunsu 2013-06-03 18:47:04

3 réponses

je pense que ça pourrait être un bug dans swagger ui.

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

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

j'Espère que cette aide,

26
répondu gsimoes 2013-06-03 20:06:43

dans swagger-ui 2.0 ou plus, 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"));
  }
})

C'est aussi beaucoup plus extensible et supporte les mécanismes d'authentification personnalisés.

20
répondu fehguy 2013-09-05 19:01:39

vous pouvez essayer ce

(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
répondu Tuan Minh 2016-09-15 06:41:01