我最近在 Visual Studio 2012 中启动了一个 Web API 2 项目,使用 OWIN 中间件通过 OAuth2 对用户进行身份验证。我合并了本教程中概述的基于令牌的身份验证(基于令牌的身份验证) 。身份验证部分效果很好。我添加了一些测试 API 方法,并且我想为我的 API 文档连接 Swagger。我也让这部分工作,除了来自 Swagger 的 API 调用在授权时失败。
经过研究,我找到了Erik Dahl关于如何将 Swagger 连接到 OWIN 中间件的帖子。根据帖子配置我的 Swagger 后,我现在可以在 Swagger UI 上看到每个 API 方法旁边的身份验证按钮。但是,当尝试进行身份验证时,Swagger 中的身份验证是使用 GET 请求完成的。Web API 上的身份验证虽然要求它是 POST 请求。是否可以配置 Swagger 使身份验证请求成为 POST?如果不是,我是否应该允许我的 API 接受 GET 请求以进行令牌身份验证?完成这项工作的最佳方法是什么?
注意:请求仍然符合我的身份验证逻辑,但是 client_id 和 client_secret 没有在 GET 请求中传递,仅在 POST 请求中传递。
这是我的 Swagger 配置:
httpConfig
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "Sample API");
c.ApiKey("token")
.Description("API Key Authentication")
.Name("Bearer")
.In("header");
c.OAuth2("oauth2")
.AuthorizationUrl("/oauth/token")
.Flow("implicit")
.Description("OAuth2 authentication")
.Scopes(scopes =>
{
scopes.Add("sampleapi", "Sample API");
});
c.OperationFilter<AssignOAuth2SecurityRequirements>();
})
.EnableSwaggerUi(c =>
{
c.EnableOAuth2Support(
clientId: "Sample_App",
clientSecret: "xxxxx",
realm: "test-realm",
appName: "Swagger UI");
});
这是我的 OAuth 配置:
app.CreatePerOwinContext<ApiClientRepo>(ApiClientRepo.Create);
app.CreatePerOwinContext<MeetingRegistrantRepo>(MeetingRegistrantRepo.Create);
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
//For Dev enviroment only (on production should be AllowInsecureHttp = false)
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/oauth/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new CustomOAuthProvider(),
AccessTokenFormat = new CustomJwtFormat("http://localhost:51071"),
RefreshTokenProvider = new SimpleRefreshTokenProvider()
};
// OAuth 2.0 Bearer Access Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);