如何修复API密钥在Swagger Header中作为加密密钥传递

uqxowvwt  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(82)

我已经为Swagger添加了一个头参数,用于API密钥,这可以提供输入API密钥的能力。

  • Swashbuckle.AspNetCore 6.1
  • Swashbuckle.AspNetCore.Swagger 6.1
  • Swashbuckle.AspNetCore.SwaggerGen 6.1
  • Swashbuckle.AspNetCore.SwaggerUI 6.1


的数据
我的代码如下,在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 我可以看到头值。
这是我第一次尝试这样做,所以很可能我错过了一些东西,问题是什么?
从Postman

检索的值
任何建议将不胜感激。

xwmevbvl

xwmevbvl1#

好吧,我终于把这个工作做好了,我添加了以下内容:

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这里,这就是我试图实现的。x1c 0d1x
但是,似乎应该从这里调用Authorise,或者单击每个控制器上的挂锁图标。

我试图让参数工作,但无论我做了什么,它总是返回一个参数。现在我不确定你是否必须使用新的授权按钮,出现在Swagger中,当你应用更改的配置,但它会做测试在Swagger中,我宁愿API键参数,如第一张图片所示,当我添加密钥并从请求头中提取时,它已经工作。
似乎没有人能在这方面给我指出任何一个方向。

ttcibm8c

ttcibm8c2#

在我的例子中,我以这种方式配置了Class元数据,

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 {
    // ...  
}

字符串
成功了!希望对你有帮助

相关问题