Интерфейс Swagger UI, передающий токен аутентификации для вызова API в заголовке
Я новичок в Swagger.
Я использую пользовательский интерфейс Swagger для создания документации swagger. У меня есть два вызова API. Первый вызов заключается в создании токена на основе имени пользователя и пароля. Второй токен вызова требует первого вызова.
Как я установил этот токен для второго вызова с использованием интерфейса Swagger?
Ответы
Ответ 1
@ApiImplicitParams
и @ApiImplicitParam
должны сделать @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 будет обновлен, и вы сможете отправлять свой токен оттуда. Никаких изменений в HTML не потребуется.
Примечание. Некоторое время назад, документируя REST API с помощью Swagger, я понял, что простого добавления @ApiImplicitParam
недостаточно (даже если у вас есть только один параметр).В любом случае, вы также должны добавить @ApiImplicitParams
.
Ответ 2
Это старый вопрос, но именно так я решил его недавно с версией 2.7.0 для моих токенов JWT
В вашей конфигурации swagger добавьте ниже SecurityConfiguration
bean. Важная часть оставляет пятый аргумент пустым или нулевым.
@Bean
public SecurityConfiguration securityInfo() {
return new SecurityConfiguration(null, null, null, null, "", ApiKeyVehicle.HEADER,"Authorization","");
}
Добавьте securitySchemes(Lists.newArrayList(apiKey()))
к основному Docket
bean.
@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 вам нужно щелкнуть по кнопке Авторизация и ввести "Bearer access_token" (для текстового поля "Авторизация" ), где access_token - это токен, предоставляемый сервером токенов jWT.
Как только эта авторизация будет сохранена, это вступит в силу для всех конечных точек. Добавление отдельного текстового поля для каждой конечной точки выглядит очень громоздким.
Ответ 3
Вам нужно будет настроить страницу индексации swagger, чтобы добиться того, что я считаю.
Вы можете сделать ввод "input_apiKey" скрытым и добавить два входа для имени пользователя и пароля. Затем вы делаете ajax-вызов для обновления скрытого ввода с помощью токена.
Ответ 4
Моя конфигурация для версии 2.9.2 Swagger для добавления авторизации в интерфейсе 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");
}
Ответ 5
Есть взлом, который может работать с использованием responseInterceptor и requestInterceptor
Сначала перехватите ответ на первый вызов API с использованием responseInterceptor
и сохраните токен (в примере в локальном хранилище), затем используйте 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;
}
}