当前位置: 首页 > 知识库问答 >
问题:

带有虚张声势的标头中的 API 密钥

季凡
2023-03-14

我想使用Swashuckle(swagger for. net)在WebAPI项目上进行基于API密钥的身份验证。

我已经配置了如下虚张声势:

config
    .EnableSwagger(c =>
    {
        c.ApiKey("apiKey")
            .Description("API Key Authentication")
            .Name("X-ApiKey")
            .In("header");
        c.SingleApiVersion("v1", "My API");

    })
    .EnableSwaggerUi();

(见 https://github.com/domaindrivendev/Swashbuckle#describing-securityauthorization-schemes)

它似乎创建了我所期望的swagger文件:

   "securityDefinitions": {
      "apiKey": {
        "type": "apiKey",
        "description": "API Key Authentication",
        "name": "X-ApiKey",
        "in": "header"
      }
    }

但是当我进入UI并‘尝试’时,它试图将API键放入查询字符串(我认为这是默认行为)而不是头。

例如:

curl-X POST——标题“Accept:application/json”http://localhost:63563/api/MyMethod?api_key=key“

如何让 swagger 使用将 API 密钥放在标头中而不是查询字符串中?

共有2个答案

湛功
2023-03-14

您必须在原始的基础上注入一个自定义的index.html(如这里所述),并在函数< code > addApiKeyAuthorization 中更改下面一行:

var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization("X-ApiKey", key, "header");
皇甫逸清
2023-03-14

正如贾斯汀·格雷沃尔夫的评论中已经指出的那样。

“In”和“Type”属性已从字符串更改为< code>ParameterLocation和< code>SecuritySchemeType枚举:

services.AddSwaggerGen(c =>{
    c.SwaggerDoc("v1", new Info { Title = "[anything]", Version = "v1" });
    c.AddSecurityDefinition("[auth scheme: same name as defined for asp.net]", new ApiKeyScheme() {
        In = ParameterLocation.Header,
        Name = "X-API-KEY", //header with api key
        Type = SecuritySchemeType.ApiKey,
    });
});

范式已经转变,以适应生成的swagger.json中的安全定义

来源https://github.com/domaindrivendev/Swashbuckle.AspNetCore # add-安全定义和要求

services.AddSwaggerGen(c =>{
    c.SwaggerDoc("v1", new Info { Title = "[anything]", Version = "v1" });
    c.AddSecurityDefinition("[auth scheme: same name as defined for asp.net]", new ApiKeyScheme() {
        In = "header", // where to find apiKey, probably in a header
        Name = "X-API-KEY", //header with api key
        Type = "apiKey", // this value is always "apiKey"
    });

});

检查出来:

config
    .EnableSwagger(c =>
    {
        c.ApiKey("apiKey")
            .Description("API Key Authentication")
            .Name("X-ApiKey")
            .In("header");
        c.SingleApiVersion("v1", "My API");

    })
    .EnableSwaggerUi(c => {
        c.EnableApiKeySupport("X-ApiKey", "header");
    })
 类似资料:
  • null 另外,作为API开发人员,如果我不使用它,我会失去什么?

  • 我正在ASP中使用Swashback 5。NET webapi项目,具有所有默认设置。它序列化方法的输出,以便向我显示应答的模式。我得到的文档如下所示: 这是由以下C#代码生成的 结果在哪里。结果基本上是一个标准的对象列表,每个对象都包含这些键/值/id字段。我在这里读过https://conficient.wordpress.com/2014/05/22/getting-rid-of-k__ba

  • 我正在为我的spring boot项目使用swagger注释。 我想为控制器的每个资源返回一个公共响应代码契约。 在文件中:https://github.com/swagger-api/swagger-core/wiki/annotations#apiresponses-apiresponse他们谈论@ApiResponses,但我不能将注释放在类级别。 以下是我所做的: 但问题是和中的坏东西从未

  • 在我的“简化”API中,所有响应都是从基本“响应”类派生(继承)的。响应类由一个填充元数据的头和一个包含用户请求的核心数据的主体组成。响应(在JSON中)的布局使得所有元数据都在第一个“层”上,而主体是一个称为“主体”的单一属性 我试图用以下JSON来定义这种关系: 然后,我尝试通过创建从body/header继承的各种body/header类来创建不同的响应,然后创建由相关的header/bod

  • 我的中有以下操作。NET核心2控制器。它是一个API,应该存储作为应用程序/x-www-form-urlencoded发布的所有数据 所以斯瓦格UI允许使用UI尝试这个动作:斯瓦格UI 但是SwaggerUI生成带有正文的POST:formData=field 1=value e1&field 2=value e2 我希望它是:field1=value1 所以问题是,这是OpenAPI的限制,还是

  • 嗯,我在API文档中使用了Swagger,它在本地主机中工作得很好,当我将它托管在IIS上时,问题就开始了。对于somereason来说,它不再起作用了 本地主机: 我的控制器代码只有这个方法: