2013-06-03 37 views
21

Tôi đang sử dụng swagger với servicestack nhưng tôi nhận được lỗi 401 trái phép từ URL/tài nguyên của mình vì nó yêu cầu khóa API.Làm cách nào để Swagger gửi khóa API dưới dạng http thay vì trong URL

Trừ khi tôi là nhầm lẫn, according to the documentation tôi nên đặt supportHeaderParams true cũng như apiKeyNameapiKey giá trị trong các thông số JSON khi khởi Swagger từ trang html của tôi.

Sau đó tôi đã mong đợi thấy khóa API của mình trong tiêu đề yêu cầu http, nhưng nó vẫn được nối vào URL và không được thêm vào bộ sưu tập tiêu đề.

Dưới đây là đoạn code mà initialises Swagger trong trang HTML của tôi:

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

Đáng tiếc là tôi không nhận được tiêu đề ở tất cả, không có 'Api-Key' hoặc 'testheader'.

+0

vấn đề này tương tự cho tôi ... – gsimoes

+0

Tôi đoán đây có liên quan đến vênh vang (http://goo.gl/kMHNz) nhưng tôi vẫn không biết làm thế nào để sửa chữa nó trong servicestack – gsimoes

Trả lời

26

Tôi nghĩ rằng đó có thể là lỗi trong ui.

Giải pháp thay thế, tôi đã thêm phần sau vào tệp index.html.

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

Hope this helps,

+0

Chúc mừng sự giúp đỡ của bạn! Tôi sẽ cố gắng, cảm ơn. –

+0

Bạn có thể muốn xem phiên bản mới của swagger-ui - 1.3. _supportHeaderParams_ không còn cần thiết nữa. – Eyal

+0

Đã dành cho tôi rất nhiều thời gian, cảm ơn bạn rất nhiều! – RooSoft

20

Trong vênh vang-ui 2.0 hoặc cao hơn, đây là tầm thường:

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

Đây cũng là nhiều hơn nữa có thể mở rộng và hỗ trợ cơ chế xác thực tùy chỉnh .

+0

Cảm ơn bạn đã cập nhật! Tôi không biết có một phiên bản 2.0 phát hành, tôi chắc chắn sẽ xem xét. Chúc mừng –

+0

Cách đặt #input_apiGiá trị khóa cho khóa được tạo động ?. Tôi đang đấu tranh cho điều đó từ 2 ngày. Hãy giúp tôi ra. Ngoài ra đăng câu hỏi trong S.O. http://stackoverflow.com/questions/33435286/swagger-ui-passing-authentication-token-to-api-call-in-header –

+2

Điều này không hoạt động. Bất kỳ sự bổ sung nào vào các header bằng window.authorizations.add() hoặc window.swaggerUi.api.clientAuthorizations.add() không có bất kỳ hiệu ứng nào và tiêu đề Authorization không được thêm vào. – mixdev

1

bạn có thể thử

(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); 
     } 
    } 
})(); 
Các vấn đề liên quan