Swaggerは初めてです。
Swaggerドキュメントを生成するためにSwagger UIを使用しています。 2つのAPI呼び出しがあります。最初の呼び出しは、ユーザー名とパスワードに基づいてトークンを生成することです。 2回目の呼び出しには、最初の呼び出しで生成されたトークンが必要です。
Swagger UIを使用して2回目の呼び出しにそのトークンを設定するにはどうすればよいですか?
@ApiImplicitParams
および @ApiImplicitParam
トリックを行う必要があります。
@GET
@Produces("application/json")
@ApiImplicitParams({
@ApiImplicitParam(name = "Authorization", value = "Authorization token",
required = true, dataType = "string", paramType = "header") })
public String getUser(@PathParam("username") String userName) {
...
}
ドキュメント から:
操作パラメーターを手動で記述したい場合があります。これには、さまざまな理由が考えられます。たとえば、次のとおりです。
- JAX-RS注釈を使用しないサーブレットの使用。
- 定義されているパラメータを非表示にし、完全に異なる定義で上書きしたい。
- JAX-RS実装に到達する前に、フィルターまたは別のリソースによって使用されるパラメーターを説明します。
Swagger UIが更新されるので、そこからトークンを送信できます。 HTMLを変更する必要はありません。
注:しばらく前に、REST APIとSwaggerをドキュメント化するとき、 @ApiImplicitParam
では不十分です(パラメーターが1つしかない場合でも)。とにかく、 @ApiImplicitParams
も。
これは古い質問ですが、これは私が最近JWTトークンのバージョン2.7.0でそれを解決した方法です
Swagger構成で、以下のSecurityConfiguration
Beanを追加します。重要な部分は、5番目の引数を空またはヌルのままにします。
_@Bean
public SecurityConfiguration securityInfo() {
return new SecurityConfiguration(null, null, null, null, "", ApiKeyVehicle.HEADER,"Authorization","");
}
_
メインDocket
BeanにsecuritySchemes(Lists.newArrayList(apiKey()))
を追加します。
_@Bean
public Docket docket()
{
return new Docket(DocumentationType.SWAGGER_2).select()
.....build().apiInfo(...).securitySchemes(Lists.newArrayList(apiKey()));
}
private ApiKey apiKey() {
return new ApiKey("Authorization", "Authorization", "header");
}
_
次に、UIでAuthorizeボタンをクリックし、「Bearer access_token」(認証テキストボックス)を入力する必要があります。access_tokenはjWTトークンサーバーによって提供されるトークンです。
この承認が保存されると、すべてのエンドポイントで有効になります。各エンドポイントに個別のテキストフィールドを追加するのは非常に面倒です。
Swagger UIに認証を追加してBearerトークンを送信する2.9.2 Swaggerバージョンの構成
@Bean
public Docket api(ServletContext servletContext) {
return new Docket(DocumentationType.SWAGGER_2)...
.securitySchemes(Arrays.asList(apiKey()))
.securityContexts(Collections.singletonList(securityContext()));
}
private SecurityContext securityContext() {
return SecurityContext.builder().securityReferences(defaultAuth()).forPaths(PathSelectors.regex("/.*")).build();
}
private List<SecurityReference> defaultAuth() {
final AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
final AuthorizationScope[] authorizationScopes = new AuthorizationScope[]{authorizationScope};
return Collections.singletonList(new SecurityReference("Bearer", authorizationScopes));
}
private ApiKey apiKey() {
return new ApiKey("Bearer", "Authorization", "header");
}
それを実現するには、 swagger index page をカスタマイズする必要があります。
入力「input_apiKey」を非表示にして、ユーザー名とパスワードの2つの入力を追加できます。次に、ajax呼び出しを行って、トークンで非表示の入力を更新します。
ResponseInterceptorおよびrequestInterceptorを使用して機能するハックがあります
最初にresponseInterceptor
を使用して最初のAPI呼び出しの応答をキャプチャし、トークン(ローカルストレージの例)を保存し、requestInterceptor
を使用して保存したAuthorization
ヘッダーを追加しますトークン。
const ui = SwaggerUIBundle({
...
responseInterceptor:
function (response) {
if (response.obj.access_token) {
console.log(response.obj.access_token)
const token = response.obj.access_token;
localStorage.setItem("token", token)
}
return response;
},
requestInterceptor:
function (request) {
console.log('[Swagger] intercept try-it-out request');
request.headers.Authorization = "Bearer " + localStorage.getItem("token");
return request;
}
}