basepath rest jersey swagger swagger-ui

rest - basepath - swagger https



Swagger UI pasando token de autenticación a llamada a API en el encabezado (5)

Soy nuevo en Swagger.

Estoy utilizando Swagger UI para generar documentación de Swagger. Tengo dos llamadas a la API. La primera llamada es generar un token basado en el nombre de usuario y la contraseña. La segunda llamada necesita un token generado por la primera llamada.

¿Cómo configuro ese token para la segunda llamada usando Swagger UI?


Esta es una pregunta antigua, pero así es como lo resolví recientemente con la versión 2.7.0 para mis tokens JWT

En su configuración de Swagger, agregue a continuación el bean SecurityConfiguration . Parte importante es dejar el quinto argumento vacío o nulo.

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

Agregue securitySchemes(Lists.newArrayList(apiKey())) a su 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"); }

Luego, en la interfaz de usuario, debe hacer clic en el botón Autorizar e ingresar "Portador access_token" (para el cuadro de texto Autorización) donde access_token es el token proporcionado por el servidor de token jWT.

Una vez que se guarde esta autorización, se hará efectiva para todos los puntos finales. Agregar un campo de texto separado para cada punto final parece muy engorroso.


Hay un hack que podría funcionar utilizando responseInterceptor y requestInterceptor

Primero capture la respuesta de la primera llamada a la API usando responseInterceptor y guarde el token (en el ejemplo en el almacenamiento local), luego use requestInterceptor para agregar el encabezado de Authorization con el token guardado.

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; } }


Mi configuración para la versión 2.9.2 Swagger para agregar Autorización en la interfaz de usuario de Swagger y enviar el token de portador

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


Tendrías que personalizar la página de índice de Swagger para lograr eso, creo.

Puede ocultar la entrada ''input_apiKey'' y agregar dos entradas para el nombre de usuario y la contraseña. Luego, realiza una llamada ajax para actualizar la entrada oculta con su token.


@ApiImplicitParams y @ApiImplicitParam deberían hacer el truco:

@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 :

Es posible que desee que describa los parámetros de operación manualmente. Esto puede ser por varias razones, por ejemplo:

  • Usando Servlets que no usan anotaciones JAX-RS.
  • Querer ocultar un parámetro como se define y anularlo con una definición completamente diferente.
  • Describa un parámetro que utiliza un filtro u otro recurso antes de alcanzar la implementación de JAX-RS.

La interfaz de usuario de Swagger se actualizará para que pueda enviar su token desde allí. No serán necesarios cambios a HTML.

Nota: Hace un tiempo, al documentar una API REST con Swagger, me di cuenta de que solo agregar @ApiImplicitParam no es suficiente (incluso si solo tiene un parámetro). De todos modos, también debe agregar @ApiImplicitParams .