web-dev-qa-db-ja.com

認証トークンをヘッダーでAPI呼び出しに渡すSwagger UI

Swaggerは初めてです。

Swaggerドキュメントを生成するためにSwagger UIを使用しています。 2つのAPI呼び出しがあります。最初の呼び出しは、ユーザー名とパスワードに基づいてトークンを生成することです。 2回目の呼び出しには、最初の呼び出しで生成されたトークンが必要です。

Swagger UIを使用して2回目の呼び出しにそのトークンを設定するにはどうすればよいですか?

19
Java P

@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 も。

26
cassiomolin

これは古い質問ですが、これは私が最近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トークンサーバーによって提供されるトークンです。

この承認が保存されると、すべてのエンドポイントで有効になります。各エンドポイントに個別のテキストフィールドを追加するのは非常に面倒です。

2
Sabir Khan

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");
      } 
2
Rzv Razvan

それを実現するには、 swagger index page をカスタマイズする必要があります。

入力「input_apiKey」を非表示にして、ユーザー名とパスワードの2つの入力を追加できます。次に、ajax呼び出しを行って、トークンで非表示の入力を更新します。

1
gsimoes

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;
                }
           }
0
Alex Efimov