我已向 Swagger 添加了 API 密钥的标头参数,这在提供输入 API 密钥的功能方面发挥了作用。 我正在使用以下
我的代码如下,在Startup.cs中我有以下用于添加Swagger配置的位置
public void ConfigureServices(IServiceCollection services)
services.AddSwaggerGen(config =>
{
config.OperationFilter<SwaggerFilter>();
});
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Swift Api V1");
c.RoutePrefix = string.Empty;
});
Swaggerfilter 的完整代码是
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Collections.Generic;
namespace SwiftApi.Api
{
public class SwaggerFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.Parameters == null)
operation.Parameters = new List<OpenApiParameter>();
operation.Parameters.Add(new OpenApiParameter
{
Name = "Authorization",
In = ParameterLocation.Header,
Schema = new OpenApiSchema { Type = "string" },
Description = "API Key",
Required = true
});
}
}
}
但是,在检查标头中传递的值的方法中,在我的标头值列表中找不到该值
在网上查看后,我看不到我做错了什么,但显然我遗漏了一些东西,当我使用 Postman 时,我可以看到标头值。
这是我第一次尝试这样做,所以很可能我错过了一些东西,问题是什么呢?
如有任何建议,我们将不胜感激。
好吧,终于自己解决了这个问题,我添加了以下内容;
services.AddSwaggerGen(config =>
{config.AddSecurityDefinition("Authorization", new
OpenApiSecurityScheme()
{
Type = SecuritySchemeType.ApiKey,
In = ParameterLocation.Header,
Name = "Authorization",
Description = "API Key",
Scheme = "ApiKeyScheme"
});
var key = new OpenApiSecurityScheme()
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Authorization"
},
In = ParameterLocation.Header
};
var requirement = new OpenApiSecurityRequirement
{
{key, new List<string>() }
};
config.AddSecurityRequirement(requirement);
config.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version= "v1"});
并删除了代码;
config.OperationFilter<SwaggerFilter>();
这用于将 ApiKey 参数放置在 Swagger 中,这就是我想要实现的目标。
我试图让参数正常工作,但无论我做什么,它总是返回 Null。现在我不确定当您将更改应用于配置时是否必须使用 Swagger 中出现的新授权按钮,但在 Swagger 中测试这一点是可以的,我更喜欢 API Key 参数,如图所示在第一张图片中,当我添加密钥然后从请求标头中提取它时,它就起作用了。
似乎没有人能够在这方面向我指出任何一个方向。
在我的例子中,我以这种方式配置了类元数据,
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.security.SecurityRequirements;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import io.swagger.v3.oas.annotations.security.SecuritySchemes;
@SecuritySchemes({
@SecurityScheme(
name = "Authorization",
type = SecurityScheme.Type.APIKEY,
in = SecurityScheme.In.HEADER,
paramName = "Authorization"
)
})
@SecurityRequirements({
@SecurityRequirement(name = "Authorization")
})
@OpenAPIDefinition(
// ...
)
public class Metadata {
// ...
}
成功了!希望有帮助