it-swarm.com.de

Swagger-Benutzeroberfläche übergibt Authentifizierungstoken an den API-Aufruf im Header

Ich bin neu bei Swagger.

Ich verwende die Swagger-Benutzeroberfläche, um eine Swagger-Dokumentation zu erstellen. Ich habe zwei API-Aufrufe. Der erste Aufruf besteht darin, ein Token basierend auf Benutzernamen und Kennwort zu generieren. Beim zweiten Anruf muss das Token beim ersten Aufruf generiert werden.

Wie lege ich das Token für den zweiten Anruf mithilfe der Swagger-Benutzeroberfläche fest?

17
Java P

@ApiImplicitParams und @ApiImplicitParam sollte den Trick ausführen:

@GET
@Produces("application/json")
@ApiImplicitParams({
    @ApiImplicitParam(name = "Authorization", value = "Authorization token", 
                      required = true, dataType = "string", paramType = "header") })
public String getUser(@PathParam("username") String userName) {
    ...
}

Aus der Dokumentation :

Möglicherweise möchten Sie die Betriebsparameter manuell beschreiben. Dies kann zum Beispiel aus verschiedenen Gründen sein:

  • Verwenden von Servlets, die keine JAX-RS-Anmerkungen verwenden.
  • Einen Parameter ausblenden möchten, während er definiert ist, und ihn mit einer völlig anderen Definition überschreiben.
  • Beschreiben Sie einen Parameter, der von einem Filter oder einer anderen Ressource verwendet wird, bevor Sie die JAX-RS-Implementierung erreichen.

Die Swagger-Benutzeroberfläche wird aktualisiert, sodass Sie Ihr Token von dort aus senden können. HTML-Änderungen sind nicht erforderlich.


Note: Vor einiger Zeit, als ich eine REST - API mit Swagger dokumentierte, wurde mir klar, dass das Hinzufügen von @ApiImplicitParam nicht ausreicht (selbst wenn Sie nur einen Parameter haben). Auf jeden Fall müssen Sie auch @ApiImplicitParams hinzufügen.

22
cassiomolin

Dies ist eine alte Frage, aber so habe ich sie kürzlich mit der Version 2.7.0 für meine JWT-Token gelöst

Fügen Sie in Ihrer Swagger-Konfiguration unten SecurityConfiguration bean hinzu. Es ist wichtig, dass das fünfte Argument leer oder null ist. 

@Bean
    public SecurityConfiguration securityInfo() {
        return new SecurityConfiguration(null, null, null, null, "", ApiKeyVehicle.HEADER,"Authorization","");
    }

Fügen Sie securitySchemes(Lists.newArrayList(apiKey())) zu Ihrer Docket-Bean hinzu. 

@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");
    } 

Dann müssen Sie in der Benutzeroberfläche auf die Schaltfläche Authorize klicken und "Bearer access_token" (für das Textfeld Authorization) eingeben, wobei access_token das vom jWT-Tokenserver bereitgestellte Token ist. 

Sobald diese Berechtigung gespeichert ist, wird dies für alle Endpunkte wirksam. Das Hinzufügen eines separaten Textfelds für jeden Endpunkt erscheint sehr umständlich. 

2
Sabir Khan

Sie müssten die Indexseite swagger anpassen , um dies zu erreichen, glaube ich.

Sie können die Eingabe 'input_apiKey' ausblenden und zwei Eingaben für Benutzername und Kennwort hinzufügen. Dann führen Sie einen Ajax-Aufruf aus, um die verborgene Eingabe mit Ihrem Token zu aktualisieren.

1
gsimoes

Meine Konfiguration für 2.9.2 Swagger-Version, um die Autorisierung auf der Swagger-Benutzeroberfläche hinzuzufügen und das Trägertoken zu senden 

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

Es gibt einen Hack, der mithilfe von responseInterceptor und requestInterceptor funktionieren kann

Erfassen Sie zunächst die Antwort des ersten API-Aufrufs mit responseInterceptor und speichern Sie das Token (im Beispiel im lokalen Speicher). Fügen Sie dann mit requestInterceptor den Header Authorization mit dem gespeicherten Token hinzu.

            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