web-dev-qa-db-fra.com

Swagger UI passe le jeton d'authentification à l'appel de l'API dans l'en-tête

Je suis nouveau à Swagger.

J'utilise l'interface utilisateur Swagger pour générer de la documentation swagger. J'ai deux appels d'API. Le premier appel consiste à générer un jeton basé sur le nom d'utilisateur et le mot de passe. Le deuxième appel a besoin du jeton généré par le premier appel.

Comment définir ce jeton pour le deuxième appel à l'aide de l'interface utilisateur Swagger?

17
Java P

@ApiImplicitParams et @ApiImplicitParam devrait faire l'affaire:

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

De la documentation :

Vous voudrez peut-être décrire les paramètres d'opération manuellement. Cela peut être pour diverses raisons, par exemple:

  • Utilisation de servlets qui n'utilisent pas les annotations JAX-RS.
  • Vouloir masquer un paramètre tel qu'il est défini et le remplacer par une définition complètement différente.
  • Décrivez un paramètre utilisé par un filtre ou une autre ressource avant d'atteindre l'implémentation JAX-RS.

L’interface utilisateur Swagger sera mise à jour afin que vous puissiez envoyer votre jeton à partir de là. Aucune modification du code HTML ne sera nécessaire.


Remarque: Il y a quelque temps, en documentant une API REST avec Swagger, je me suis rendu compte que le simple ajout de @ApiImplicitParam n'est pas suffisant (même si vous n'avez qu'un seul paramètre). Quoi qu'il en soit, vous devez ajouter @ApiImplicitParams aussi.

22
cassiomolin

C'est une vieille question mais voici comment je l'ai résolue récemment avec la version 2.7.0 pour mes jetons JWT

Dans votre configuration swagger, ajoutez ci-dessous le bean SecurityConfiguration. Partie importante laissant le cinquième argument vide ou nul. 

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

Ajoutez securitySchemes(Lists.newArrayList(apiKey())) à votre bean Docket principal. 

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

Ensuite, dans l'interface utilisateur, vous devez cliquer sur le bouton Autoriser et saisir "Bearer access_token" (zone de texte pour l'autorisation) où access_token est un jeton fourni par le serveur de jetons jWT. 

Une fois cette autorisation sauvegardée, elle deviendra effective pour tous les points finaux. L'ajout d'un champ de texte distinct pour chaque extrémité est très fastidieux. 

2
Sabir Khan

Vous devrez personnaliser la page swagger index pour y parvenir, je crois.

Vous pouvez masquer l'entrée 'input_apiKey' et ajouter deux entrées pour le nom d'utilisateur et le mot de passe. Ensuite, vous effectuez un appel ajax pour mettre à jour l'entrée masquée avec votre jeton.

1
gsimoes

Ma configuration pour la version 2.9.2 Swagger pour ajouter une autorisation sur l'interface utilisateur Swagger et envoyer le jeton du porteur 

        @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

Il y a un hack qui pourrait fonctionner en utilisant responseInterceptor et requestInterceptor

Capturez d'abord la réponse du premier appel d'API à l'aide de responseInterceptor et enregistrez le jeton (dans l'exemple du stockage local), puis utilisez requestInterceptor pour ajouter l'en-tête Authorization avec le jeton enregistré.

            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