如何使用 OpenIddict 参数配置 SwaggerGen 以授予客户端凭据?
How do I configure SwaggerGen with OpenIddict parameters for client credentials grant?
我正在尝试弄清楚如何将 SwaggerGen 配置为 populate/display fields/parameters 用于 OpenIddict 和客户端凭据授予。
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
options.UseOpenIddict();
});
services.AddOpenIddict()
.AddCore(options =>
{
// Configure OpenIddict to use the Entity Framework Core stores and models.
// Note: call ReplaceDefaultEntities() to replace the default entities.
options.UseEntityFrameworkCore().UseDbContext<AppDbContext>();
})
.AddServer(options =>
{
// Enable the token endpoint.
options.SetTokenEndpointUris("/connect/token");
// Enable the client credentials flow.
options.AllowClientCredentialsFlow();
// Register the signing and encryption credentials.
options.AddDevelopmentEncryptionCertificate()
.AddDevelopmentSigningCertificate();
// Register the ASP.NET Core host and configure the ASP.NET Core options.
options.UseAspNetCore()
.EnableTokenEndpointPassthrough();
})
.AddValidation(options =>
{
// Import the configuration from the local OpenIddict server instance.
options.UseLocalServer();
// Register the ASP.NET Core host.
options.UseAspNetCore();
});
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "PCM", Version = "v1" });
options.AddSecurityDefinition("Authentication", new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OpenIdConnect,
Description = "Description",
In = ParameterLocation.Header,
Name = "Notsure",
Flows = new OpenApiOAuthFlows
{
ClientCredentials = new OpenApiOAuthFlow
{
AuthorizationUrl = new Uri("/connect/token", UriKind.Relative),
TokenUrl = new Uri("/connect/token", UriKind.Relative),
Scopes = new Dictionary<string, string>()
{
}
}
},
OpenIdConnectUrl = new Uri("/connect/authorize", UriKind.Relative)
});
});
它显示授权按钮,但当我单击它时,它会打开一个空模式,如下图所示:
感谢任何能给我指点一些文档的人,这些文档会解释我需要在 services.AddSwaggerGen()
中配置什么才能进行配置,这样我们就可以通过 Swagger 生成的交互式文档轻松测试我们的 API .
定义 OpenApiSecurityScheme
.
时需要指定更多选项
设置方法如下:
- 指定
TokenUrl
。客户端凭据流在 /token
端点上工作,因此我们必须给它一个正确的 URL。这里我使用了 IdentityServer 的 demo server
- 指定令牌将如何发送到后端:我们希望它在
Authorization
header 中使用 Bearer
方案发送。
- 指定应用程序需要的范围。这是一个映射范围 -> 描述的字典。
- 最后,添加一个安全要求(此处适用于所有端点),该要求将在端点旁边显示一个锁图标。 (这也有助于代码生成期间的其他 OpenAPI 客户端)
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(
c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "ApiPlayground", Version = "v1" });
c.AddSecurityDefinition(
"oauth",
new OpenApiSecurityScheme
{
Flows = new OpenApiOAuthFlows
{
ClientCredentials = new OpenApiOAuthFlow
{
Scopes = new Dictionary<string, string>
{
["api"] = "api scope description"
},
TokenUrl = new Uri("https://demo.identityserver.io/connect/token"),
},
},
In = ParameterLocation.Header,
Name = HeaderNames.Authorization,
Type = SecuritySchemeType.OAuth2
}
);
c.AddSecurityRequirement(
new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{ Type = ReferenceType.SecurityScheme, Id = "oauth" },
},
new[] { "api" }
}
}
);
}
);
}
这是全部设置完成后的样子:
身份验证后,它会填充令牌:
现在我们可以发送请求了,Swagger UI 如我们所料将令牌包含在 header 中:
预填充身份验证弹出窗口
作为画龙点睛之笔,我们可以 pre-populate 具有一些默认值的身份验证对话框:
在我们设置 Swagger UI 的 Startup:Configure
方法中,我们可以指定客户端 ID + 密码(这违背了目的,但在本地开发中可能很有用)
app.UseSwaggerUI(c => {
c.SwaggerEndpoint("/swagger/v1/swagger.json", "ApiPlayground v1");
c.OAuthClientId("m2m");
c.OAuthClientSecret("secret");
});
参考
我正在尝试弄清楚如何将 SwaggerGen 配置为 populate/display fields/parameters 用于 OpenIddict 和客户端凭据授予。
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
options.UseOpenIddict();
});
services.AddOpenIddict()
.AddCore(options =>
{
// Configure OpenIddict to use the Entity Framework Core stores and models.
// Note: call ReplaceDefaultEntities() to replace the default entities.
options.UseEntityFrameworkCore().UseDbContext<AppDbContext>();
})
.AddServer(options =>
{
// Enable the token endpoint.
options.SetTokenEndpointUris("/connect/token");
// Enable the client credentials flow.
options.AllowClientCredentialsFlow();
// Register the signing and encryption credentials.
options.AddDevelopmentEncryptionCertificate()
.AddDevelopmentSigningCertificate();
// Register the ASP.NET Core host and configure the ASP.NET Core options.
options.UseAspNetCore()
.EnableTokenEndpointPassthrough();
})
.AddValidation(options =>
{
// Import the configuration from the local OpenIddict server instance.
options.UseLocalServer();
// Register the ASP.NET Core host.
options.UseAspNetCore();
});
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "PCM", Version = "v1" });
options.AddSecurityDefinition("Authentication", new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OpenIdConnect,
Description = "Description",
In = ParameterLocation.Header,
Name = "Notsure",
Flows = new OpenApiOAuthFlows
{
ClientCredentials = new OpenApiOAuthFlow
{
AuthorizationUrl = new Uri("/connect/token", UriKind.Relative),
TokenUrl = new Uri("/connect/token", UriKind.Relative),
Scopes = new Dictionary<string, string>()
{
}
}
},
OpenIdConnectUrl = new Uri("/connect/authorize", UriKind.Relative)
});
});
它显示授权按钮,但当我单击它时,它会打开一个空模式,如下图所示:
感谢任何能给我指点一些文档的人,这些文档会解释我需要在 services.AddSwaggerGen()
中配置什么才能进行配置,这样我们就可以通过 Swagger 生成的交互式文档轻松测试我们的 API .
定义 OpenApiSecurityScheme
.
设置方法如下:
- 指定
TokenUrl
。客户端凭据流在/token
端点上工作,因此我们必须给它一个正确的 URL。这里我使用了 IdentityServer 的 demo server - 指定令牌将如何发送到后端:我们希望它在
Authorization
header 中使用Bearer
方案发送。 - 指定应用程序需要的范围。这是一个映射范围 -> 描述的字典。
- 最后,添加一个安全要求(此处适用于所有端点),该要求将在端点旁边显示一个锁图标。 (这也有助于代码生成期间的其他 OpenAPI 客户端)
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(
c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "ApiPlayground", Version = "v1" });
c.AddSecurityDefinition(
"oauth",
new OpenApiSecurityScheme
{
Flows = new OpenApiOAuthFlows
{
ClientCredentials = new OpenApiOAuthFlow
{
Scopes = new Dictionary<string, string>
{
["api"] = "api scope description"
},
TokenUrl = new Uri("https://demo.identityserver.io/connect/token"),
},
},
In = ParameterLocation.Header,
Name = HeaderNames.Authorization,
Type = SecuritySchemeType.OAuth2
}
);
c.AddSecurityRequirement(
new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{ Type = ReferenceType.SecurityScheme, Id = "oauth" },
},
new[] { "api" }
}
}
);
}
);
}
这是全部设置完成后的样子:
身份验证后,它会填充令牌:
现在我们可以发送请求了,Swagger UI 如我们所料将令牌包含在 header 中:
预填充身份验证弹出窗口
作为画龙点睛之笔,我们可以 pre-populate 具有一些默认值的身份验证对话框:
在我们设置 Swagger UI 的 Startup:Configure
方法中,我们可以指定客户端 ID + 密码(这违背了目的,但在本地开发中可能很有用)
app.UseSwaggerUI(c => {
c.SwaggerEndpoint("/swagger/v1/swagger.json", "ApiPlayground v1");
c.OAuthClientId("m2m");
c.OAuthClientSecret("secret");
});