Как использовать Swagger в ASP.Net WebAPI 2.0 с аутентификацией на основе токенов - PullRequest
0 голосов
/ 30 июня 2018

У меня есть ASP.Net WebApi с аутентификацией на основе токенов, и я хочу использовать swagger для создания документации для этого RestApi.

На данный момент в API есть только 2 метода: один для запроса токена, т. Е. http://localhost:4040/token, а другой для создания уведомления. Возвращенный токен на предъявителя отправляется следующим образом:

using (var client = new HttpClient())
{
    // setup client
    client.BaseAddress = new Uri("http://localhost:4040");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);

    var serializedNotification = new JavaScriptSerializer().Serialize(notification);
    var stringContent = new StringContent(serializedNotification, Encoding.UTF8, "application/json");

    var response = await client.PostAsync("api/Notification", stringContent);
    response.EnsureSuccessStatusCode();

    // return URI of the created resource.
    return response.Headers.Location;
 }

С помощью swagger я могу видеть метод пост-уведомления, однако я не могу сделать запрос, потому что у меня нет токена и я не знаю, как это сделать в swagger. Любая помощь высоко ценится

Большое спасибо!

1 Ответ

0 голосов
/ 07 июля 2018

Я нашел решение сам. Я хотел бы поделиться этим в случае, если кто-то сталкивается с той же проблемой. Решение состоит из двух этапов: первый - запрос токена, а следующий шаг - добавление токена в запрос заголовка.

Итак, первый шаг:

Настройте внешний интерфейс для включения пост-запроса на запрос токена:

enter image description here

Добавьте класс AuthTokenOperation, чтобы включить который наследует интерфейс IDcoumentFilter и реализует метод Apply:

public class AuthTokenOperation : IDocumentFilter
    {
        /// <summary>
        /// Apply custom operation.
        /// </summary>
        /// <param name="swaggerDoc">The swagger document.</param>
        /// <param name="schemaRegistry">The schema registry.</param>
        /// <param name="apiExplorer">The api explorer.</param>
        public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
        {
            swaggerDoc.paths.Add("/token", new PathItem
            {
                post = new Operation
                {
                    tags = new List<string> { "Auth"},
                    consumes = new List<string>
                    {
                        "application/x-www-form-urlencoded"
                    },
                    parameters = new List<Parameter>
                    {
                        new Parameter
                        {
                            type = "string",
                            name = "grant_type",
                            required = true,
                            @in = "formData"
                        },
                        new Parameter
                        {
                            type = "string",
                            name = "username",
                            required = false,
                            @in = "formData"
                        },
                        new Parameter
                        {
                            type = "string",
                            name = "password",
                            required = false,
                            @in = "formData"
                        },
                    }
                }
            });
        }
    }

А в классе SwaggerConfig в методе register добавьте это действие

c.DocumentFilter<AuthTokenOperation>();

к методу расширения:

GlobalConfiguration.Configuration.EnableSwagger

Чтобы добавить токен авторизации в заголовок запроса:

enter image description here

Добавить этот класс операций:

/// <summary>
    /// The class to add the authorization header.
    /// </summary>
    public class AddAuthorizationHeaderParameterOperationFilter : IOperationFilter
    {
        /// <summary>
        /// Applies the operation filter.
        /// </summary>
        /// <param name="operation"></param>
        /// <param name="schemaRegistry"></param>
        /// <param name="apiDescription"></param>
        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            if (operation.parameters != null)
            {
                operation.parameters.Add(new Parameter
                {
                    name = "Authorization",
                    @in = "header",
                    description = "access token",
                    required = false,
                    type = "string"
                });
            }
        }
    }

А в классе SwaggerConfig в методе register добавьте это действие

c.OperationFilter<AddAuthorizationHeaderParameterOperationFilter>();

к методу расширения:

GlobalConfiguration.Configuration.EnableSwagger

Конечно, в поле Authoization вам нужно добавить: Носитель токен_строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...