Konfigurieren von oAuth2 mit Passwort flow mit Swagger-ui in spring boot rest-Anwendung
Ich spring boot rest-api (Ressourcen), die verwendet einen anderen spring-boot-Zulassung-server habe ich Hinzugefügt, Swagger config, um die Ressource zu Anwendung Holen Sie sich eine schöne und schnelle Dokumentation/test-Plattform für die rest-API. mein Swagger config sieht wie folgt aus:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Autowired
private TypeResolver typeResolver;
@Value("${app.client.id}")
private String clientId;
@Value("${app.client.secret}")
private String clientSecret;
@Value("${info.build.name}")
private String infoBuildName;
public static final String securitySchemaOAuth2 = "oauth2";
public static final String authorizationScopeGlobal = "global";
public static final String authorizationScopeGlobalDesc = "accessEverything";
@Bean
public Docket api() {
List<ResponseMessage> list = new java.util.ArrayList<ResponseMessage>();
list.add(new ResponseMessageBuilder()
.code(500)
.message("500 message")
.responseModel(new ModelRef("JSONResult«string»"))
.build());
list.add(new ResponseMessageBuilder()
.code(401)
.message("Unauthorized")
.responseModel(new ModelRef("JSONResult«string»"))
.build());
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.securitySchemes(Collections.singletonList(securitySchema()))
.securityContexts(Collections.singletonList(securityContext()))
.pathMapping("/")
.directModelSubstitute(LocalDate.class,String.class)
.genericModelSubstitutes(ResponseEntity.class)
.alternateTypeRules(
newRule(typeResolver.resolve(DeferredResult.class,
typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
typeResolver.resolve(WildcardType.class)))
.useDefaultResponseMessages(false)
.apiInfo(apiInfo())
.globalResponseMessage(RequestMethod.GET,list)
.globalResponseMessage(RequestMethod.POST,list);
}
private OAuth securitySchema() {
List<AuthorizationScope> authorizationScopeList = newArrayList();
authorizationScopeList.add(new AuthorizationScope("global", "access all"));
List<GrantType> grantTypes = newArrayList();
final TokenRequestEndpoint tokenRequestEndpoint = new TokenRequestEndpoint("http://server:port/oauth/token", clientId, clientSecret);
final TokenEndpoint tokenEndpoint = new TokenEndpoint("http://server:port/oauth/token", "access_token");
AuthorizationCodeGrant authorizationCodeGrant = new AuthorizationCodeGrant(tokenRequestEndpoint, tokenEndpoint);
grantTypes.add(authorizationCodeGrant);
OAuth oAuth = new OAuth("oauth", authorizationScopeList, grantTypes);
return oAuth;
}
private SecurityContext securityContext() {
return SecurityContext.builder().securityReferences(defaultAuth())
.forPaths(PathSelectors.ant("/api/**")).build();
}
private List<SecurityReference> defaultAuth() {
final AuthorizationScope authorizationScope =
new AuthorizationScope(authorizationScopeGlobal, authorizationScopeGlobalDesc);
final AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
return Collections
.singletonList(new SecurityReference(securitySchemaOAuth2, authorizationScopes));
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(“My rest API")
.description(" description here … ”)
.termsOfServiceUrl("https://www.example.com/")
.contact(new Contact(“XXXX XXXX”,
"http://www.example.com", “xxxx@example.com”))
.license("license here”)
.licenseUrl("https://www.example.com")
.version("1.0.0")
.build();
}
}
Bekomm ich die Weg das access-token aus der Zulassung-server mithilfe von http POST, um diesen link mit basic-Zulassung im header für clientid/clientpass:
http://server:port/oauth/token?grant_type=password&username=<username>&password=<password>
wird die Antwort so etwas wie:
{
"access_token": "e3b98877-f225-45e2-add4-3c53eeb6e7a8",
"token_type": "bearer",
"refresh_token": "58f34753-7695-4a71-c08a-d40241ec3dfb",
"expires_in": 4499,
"scope": "read trust write"
}
in Swagger-UI ich kann sehen, dass eine Genehmigung Schaltfläche, öffnet sich ein dialog, um die Genehmigung ersuchen, aber es wird nicht arbeiten und das lenken mich zu einem link als folgenden,
http://server:port/oauth/token?response_type=code&redirect_uri=http%3A%2F%2Fserver%3A8080%2Fwebjars%2Fspringfox-swagger-ui%2Fo2c.html&realm=undefined&client_id=undefined&scope=global%2CvendorExtensions&state=oauth
was ich hier vermisst?
http://<identityServerUrl>:<port>/connect/token
mit Postbote oder curl, aber die swagger-ui zeigt mir einen link statt...siehe mein workaround gepostet, als eine mögliche Antwort.
InformationsquelleAutor Hasson | 2017-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach 8 Monaten endlich den Passwort-Transfer wird unterstützt von Swagger UI, hier ist der endgültige code und Einstellungen, die für mich funktioniert:
1) Swagger Config:
2) in POM verwenden Sie diese Swagger-UI version 2.7.0:
3) in der Anwendung.Eigenschaften-fügen Sie die folgenden Eigenschaften:
4) in der Genehmigung server hinzufügen CORS-filter:
Wenn Sie mit diesen Einstellungen erhalten Sie den autorisieren-button in der link http://apiServer.example.com:8080/swagger-ui.html#/ (wenn Sie auf 8080) wie folgt:
Dann, wenn Sie klicken Sie auf die Schaltfläche autorisieren, erhalten Sie den folgenden Dialog fügen Sie die Daten für Ihr Benutzername/Passwort und die client id und das client secret, der Typ hat sein Wunsch Körper, ich bin nicht sicher, warum, aber dies ist, was funktioniert bei mir, obwohl ich dachte, es sollte basic auth, da dies, wie der client secret gesendet wird, jedenfalls ist dies, wie Swagger-ui arbeitet mit Kennwort-flow und alle API-Endpunkte sind wieder zu arbeiten. Gerne prahlerisch!!! 🙂
newArrayList();
wärenew ArrayList<>();
Danke @Hasson , "aktivieren" aktiviert habe, aber APIS sind nicht für mich arbeiten. Scheint nicht sendet das token mit der Anfrage. Können Sie bitte helfen Sie wieder
könnte Aktien Klasse, die Sie erweitert
ResourceServerConfigurerAdapter
? Sie haben.antMatchers("/swagger*", "/v2/**").permitAll()
?Ich habe Sie in der Klasse die sich
WebSecurityConfigurerAdapter
leider nicht teilen kann, da es enthält einige Sicherheits-features in der Anwendung.InformationsquelleAutor Hasson
Ich bin mir nicht sicher wie, was, war die Frage für Sie aber Autorisieren button arbeitet bei mir für swagger version 2.7.0, obwohl ich JWT token manuell.
Zuerst mache ich einen Treffer für den auth-token, den ich dann einfügen token wie unten
Schlüssel hier ist, dass meine Token sind JWT und ich war nicht in der Lage zum einfügen von token-Wert nach Träger ** und ändern **api_key Namen Genehmigung und das habe ich erreicht mit unter Java Konfiguration ,
Scheint es einen bug im schwadronieren über Umfang separator die standardmäßig : . In meiner config habe ich versucht diese zu ändern, um
: Bearer
aber das ist nicht passiert, also muss ich zu geben, dass auf UI .InformationsquelleAutor Sabir Khan
Der beste Weg, so weit, um die Arbeit mit oAuth2 Genehmigung ist durch die Verwendung von Swagger-Editor habe ich installiert Swagger Editor schnell in Docker (aus hier), dann verwendet der import-parameter herunterladen der API-JSON-Deskriptor (API umfassen sollte, CORS-filter), dann kann ich mich Swagger Dokumentation und eine Schnittstelle, wo ich kann hinzufügen, eine Spielfigur, die ich mit curl, Postbote, oder Firefox-rest-client.
Den link, den ich nun benutze, sieht wie folgt aus
http://docker.example.com/#/?import=http://mywebserviceapi.example.com:8082/v2/api-docs&no-proxy
die Schnittstelle in Swagger-Editor zur Eingabe der token sieht wie folgt aus:
wenn es bessere Lösungen, oder einen workaround posten Sie bitte hier Ihre Antwort ein.
InformationsquelleAutor Hasson
Dies ist ein Fehler auf swagger-ui 2.6.1 schickt vendorExtensions Umfang everytime. Und verursacht, dass die Anforderungen aus dem Anwendungsbereich, die Ergebnisse in Anträge abgelehnt. Da swagger nicht bekommen kann das access-token kann es nicht passieren, oauth2
Upgrade auf maven sollte das problem lösen. Mindestens der version 2.7.0
InformationsquelleAutor barisc