Как отправить заголовок авторизации с запросом в пользовательском интерфейсе Swagger?

У меня есть приложение ASP.NET Web Api 2. Я добавил Swashbuckle к нему (Swagger for.NET). Он не отображает мои конечные точки без проблем, но для отправки запроса мне нужно прикрепить заголовок авторизации к этому запросу. Если я правильно понимаю, для этого мне нужно изменить файл index.html(https://github.com/swagger-api/swagger-ui#how-to-use-it), поэтому я git клонировал проект Swashbuckle, чтобы изменить индекс .html и добавить некоторые заголовки.

Это единственный способ отправить заголовок авторизации с запросом в Swashbuckle?

Ответы

Ответ 1

Чтобы отправить заголовок авторизации с запросом с использованием интерфейса Swagger, мне нужно:

  • Учитывая имя моей сборки: My.Assembly и содержит папку: Swagger, где я разместил свой собственный index.html, я добавил эту строку в SwaggerConfig.cs:

     c.CustomAsset("index", thisAssembly, "My.Assembly.Swagger.index.html");
    

Обратите внимание, что index.html загружает файлы javascript и css. Я должен был изменить все точки на пунктирные пути, чтобы эти файлы загружались. Я не знаю, зачем это нужно было сделать, но он решил проблему загрузки файла...

  1. В файле index.html я изменил

    addApiKeyAuthorization()

чтобы выглядеть так:

function addApiKeyAuthorization() {
        var key = encodeURIComponent($('#input_apiKey')[0].value);
        if (key && key.trim() != "") {
            var value = "auth-scheme api_key=123456,order_id=56789";
            var authKeyHeader = new SwaggerClient.ApiKeyAuthorization("Authorization", value, "header");
            window.swaggerUi.api.clientAuthorizations.add("Authorization", authKeyHeader);
        }
    }

Примечание. Я изменил "запрос" на "заголовок".

  1. Я также раскоментировал этот код:

    var apiKey = "this field represents header but can be anything as long as its not empty";
    $('#input_apiKey').val(apiKey);
    

который отобразит текст во втором текстовом поле, но, похоже, не имеет значения, что он содержит, если он не пуст.

Это сработало для меня и позволило загрузить пользовательский файл index.html. Теперь я рассматриваю возможность пользовательского интерфейса Swagger UI манипулировать значением параметров заголовка...

Ответ 2

Я добавил код ниже в js файл и добавил его в качестве встроенного ресурса в свой веб-проект api. Когда вы создаете и запускаете Swagger, текстовое поле api_key будет заменено текстовым полем ключа авторизации, где вы можете вставить свой AuthKey, и с каждым запросом чванство добавит его в заголовок запроса.

(function () {

    $(function () {
        var basicAuthUI =
         '<div class="input"><input placeholder="Authorization Token" id="input_token" name="token" type="text"></div>';
            $(basicAuthUI).insertBefore('#api_selector div.input:last-child');
            $("#input_apiKey").hide();
            $('#input_token').change(addAuthorization);
    });

    function addAuthorization() {
        var token = $('#input_token').val();

        if (token && token.trim() !== "" ) {
            window.swaggerUi.api.clientAuthorizations.add("api_key", new window.SwaggerClient.ApiKeyAuthorization("Authorization", "Bearer " + token, "header"));
            console.log("authorization added: Bearer = " + token);
        }
    }

})();

Ответ 3

для токена-носителя. Я сделал это так: Я использовал swashbuckle только для создания файла swagger.json и использовал Swagger.Net для отображения последней версии SwaggerUI (3.xx) и ее настройки:

Итак, в моих проектных ссылках я добавил (через nuget):

ссылки

swaggerui

в index.html:

<input id="bearer-code-input" type="text" placeholder="Enter Bearer Token here" style="width: auto" value="yourtoken" />

то в конструкторе SwaggerUIBundle:

const ui = SwaggerUIBundle({
...,
requestInterceptor: function (req) {
req.headers = {
'Authorization': 'Bearer ' + document.getElementById('bearer-code-
input').value
, 'Accept': 'application/json',
'Content-Type': 'application/json'
};
return req;
},
... })

отображение результатов: result

Я также настроил множество других функций (связывание модели Json, разбор строки запроса, пользовательский SwaggerGenerator, чтобы переопределить поведение по умолчанию для ConflictingActionsResolver, чтобы иметь возможность обрабатывать несколько маршрутов маршрута, но это не входит в объем этого потока)