Как заставить Swagger / Swashbuckle добавить ключ API? - PullRequest
1 голос
/ 11 июня 2019

У меня есть проект .NET Core 2.x, который объединяет Swagger и Swashbuckle v4.x.И все это работает очень хорошо.

Однако теперь мне нужно добавить строку запроса к каждому GET, запускаемому Swagger, в форме www.foo.com/myendpoint?authorization=APIKEY.Для этого у меня в Startup.ConfigureServices есть следующее:

services.AddSwaggerGen(c => {
  c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });

  c.AddSecurityDefinition("api key", new ApiKeyScheme() {
      Description = "Authorization query string expects API key",
      In = "query",
      Name = "authorization",
      Type = "apiKey"
  });
}); 

Когда я запускаю сваггер, он предоставляет мне диалоговое окно и успешно принимает его, когда я ввожу ключ API.Однако все вызовы API по-прежнему выполняются без строки запроса.

Что мне не хватает?

enter image description here

1 Ответ

1 голос
/ 11 июня 2019

В частности, для Swashbuckle (у NSwag есть собственные средства регистрации потоков авторизации) недостаточно просто определить определение безопасности, вам также необходимо зарегистрировать, какие операции используют его.

Поскольку вы хотитедобавьте api-ключ ко всем операциям, ваш сценарий использования довольно прост: просто зарегистрируйте требование безопасности для своего определения, которое вы можете сделать так:

c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> { { "api key", new[] {} } };

Подробнее о том, какопределить, настроить и зарегистрировать различные схемы авторизации для ваших операций здесь .

А для предстоящей версии Swashbuckle версии 5 можно использовать следующий код:

c.AddSecurityDefinition("api key", new OpenApiSecurityScheme {
    Type = SecuritySchemeType.ApiKey,
    In = ParameterLocation.Query,
    Name = "authorization",
    Description = "Authorization query string expects API key"
});

var key = new OpenApiSecurityScheme() { Name = "api key"};
var requirement = new OpenApiSecurityRequirement {
    { key, new List<string>() }
};
c.AddSecurityRequirement(requirement);
...