私は最近、Visual Studio 2012 で OWIN ミドルウェアを使用して OAuth2 でユーザーを認証する Web API 2 プロジェクトを開始しました。このチュートリアル (トークンベースの認証)で概説されているように、トークンベースの認証を組み込みました。認証部分はうまく機能します。API のテスト メソッドをいくつか追加し、API ドキュメント用に Swagger を接続したいと考えました。Swagger からの API 呼び出しが承認時に失敗することを除いて、その部分も機能しました。
調査の結果、 Swagger を OWIN ミドルウェアに接続する方法に関するErik Dahl の投稿を見つけました。投稿に従って Swagger を構成した後、Swagger UI の各 API メソッドの横に認証ボタンが表示されるようになりました。ただし、認証を試みる場合、Swagger 内の認証は GET 要求を使用して行われます。ただし、Web API での認証では、POST 要求である必要があります。認証要求を POST にするように Swagger を構成することは可能ですか? そうでない場合、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);