2013-06-03 5 views
21

Sto usando lo swagger con servicestack ma ottengo un errore non autorizzato 401 dal mio/URL delle risorse perché richiede una chiave API.Come ottenere Swagger per inviare la chiave API come http anziché nell'URL

A meno che non mi sbaglio, according to the documentation devo impostare supportHeaderParams alla vera così come la apiKeyName e apikey valore nei parametri JSON durante l'inizializzazione Swagger dalla mia pagina html.

Mi aspettavo quindi di vedere la mia chiave API nelle intestazioni delle richieste http, ma viene ancora aggiunta all'URL e non nella raccolta di intestazioni.

Ecco il codice che inizializza Swagger nella mia pagina 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" 
      }); 

Purtroppo non ottengo alcuna intestazioni a tutti, no 'Api-Key' o 'testheader'.

+0

lo stesso problema per me ... – gsimoes

+0

Credo che questo è legato alla spavalderia (http://goo.gl/kMHNz), ma io ancora non so come aggiustalo in servicestack – gsimoes

risposta

26

Penso che potrebbe essere un bug nel spavalderia ui.

Per aggirare il problema, ho aggiunto il seguente nel nel file index.html spavalderia.

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

Spero che questo aiuti,

+0

Cheers per il tuo aiuto! Farò un tentativo, grazie. –

+0

Si potrebbe voler guardare la nuova versione di swagger-ui - 1.3. _supportHeaderParams_ non è più necessario. – Eyal

+0

Mi ha salvato un sacco di tempo, grazie mille! – RooSoft

20

In spavalderia-ui 2.0 o superiore, questo è banale:

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")); 
    } 
}) 

Questo è anche molto più estendibile e supporta meccanismi di autenticazione personalizzati .

+0

Grazie per l'aggiornamento! Non sapevo che fosse disponibile una versione 2.0, darò sicuramente un'occhiata. Cheers –

+0

Come impostare il valore #input_apiKey per la chiave generata dinamicamente ?. Sto lottando per quello da 2 giorni. Per favore aiutatemi. Anche la domanda pubblicata in S.O. http://stackoverflow.com/questions/33435286/swagger-ui-passing-authentication-token-to-api-call-in-header –

+2

Questo non funziona ancora. Qualsiasi aggiunta alle intestazioni con window.authorizations.add() o window.swaggerUi.api.clientAuthorizations.add() non ha alcun effetto e l'intestazione di autorizzazione non viene aggiunta. – mixdev

1

si può provare questo

(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); 
     } 
    } 
})();