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