Comment configurer oAuth2 avec flux de mots de passe avec Aisance de l'interface utilisateur au printemps de démarrage reste de l'application
J'ai de printemps de démarrage de l'api rest (ressources) qui utilise une autre source de démarrage serveur d'autorisation, j'ai ajouté Swagger config à la ressource de l'application pour obtenir une belle et rapide de la documentation/plate-forme de test pour le reste de l'API. mon Swagger config ressemble à ceci:
@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();
}
}
La façon dont je obtenir le jeton d'accès de l'Autorisation serveur via http POST à ce lien avec la base de l'autorisation dans l'en-tête clientid/clientpass:
http://server:port/oauth/token?grant_type=password&username=<username>&password=<password>
la réponse est quelque chose comme:
{
"access_token": "e3b98877-f225-45e2-add4-3c53eeb6e7a8",
"token_type": "bearer",
"refresh_token": "58f34753-7695-4a71-c08a-d40241ec3dfb",
"expires_in": 4499,
"scope": "read trust write"
}
à Swagger de l'INTERFACE utilisateur, je peux voir une Autorisation bouton qui ouvre une boîte de dialogue pour faire la demande d'autorisation, mais il ne fonctionne pas et me diriger vers un lien comme suit,
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
ce que je suis en manque ici?
http://<identityServerUrl>:<port>/connect/token
à l'aide de facteur ou curl, mais le style de l'interface utilisateur me dirige vers un lien à la place...voir ma solution affiché comme une réponse potentielle.
OriginalL'auteur Hasson | 2017-02-05
Vous devez vous connecter pour publier un commentaire.
Après 8 mois, enfin le flux de mots de passe est pris en charge dans le Style de l'INTERFACE utilisateur, voici le code final et les paramètres qui fonctionne pour moi:
1) Swagger Config:
2) dans le POM utiliser cette Fanfaronnade de l'INTERFACE utilisateur de la version 2.7.0:
3) dans l'application.propriétés ajouter les propriétés suivantes:
4) dans le serveur d'Autorisation d'ajouter un CORS du filtre:
Si vous exécutez avec ces paramètres, vous obtiendrez le bouton autoriser dans le lien http://apiServer.example.com:8080/swagger-ui.html#/ (si vous l'exécutez sur 8080) comme suit:
Ensuite, lorsque vous cliquez sur le bouton autoriser, vous obtiendrez la fenêtre de dialogue suivante, ajouter les données de votre nom d'utilisateur/mot de passe et l'id du client et le client secret, le type doit être du corps de la requête, je ne suis pas sûr pourquoi, mais c'est ce qui fonctionne avec moi, bien que j'ai pensé qu'il devrait être à la base auth que c'est la façon dont le client secret est envoyé, de toute façon c'est de cette façon Swagger-interface fonctionne avec les flux de mots de passe et toutes vos API points sont à travailler à nouveau. Heureux fanfaronne!!! 🙂
newArrayList();
seraitnew ArrayList<>();
Merci @Hasson , Autoriser le bouton ai activé, mais les API ne sont pas de travail pour moi. Semble ne pas envoyer le jeton avec la demande. Pouvez-vous s'il vous plaît aider à nouveau
pourrait partager classe qui étend la classe
ResourceServerConfigurerAdapter
? avez-vous des.antMatchers("/swagger*", "/v2/**").permitAll()
là ?Je les ai dans la classe qui s'étend
WebSecurityConfigurerAdapter
désolé de ne partager qu'il contient quelques fonctions de sécurité dans l'application.OriginalL'auteur Hasson
Je ne suis pas sûr que ce qui a été le problème pour vous, mais Autoriser bouton est de travailler pour moi pour swagger version 2.7.0, si je dois obtenir JWT jeton manuellement.
J'ai d'abord faire un hit pour la auth jeton puis-je insérer un jeton comme ci-dessous,
Clé ici est que mes jetons sont JWT et je n'étais pas capable d'insérer une valeur symbolique, après Porteur ** et évolution **api_key nom de Autorisation et que j'ai réalisés avec, en dessous de configuration Java ,
Il semble qu'il y un bug dans swagger sur champ séparateur qui, par défaut, est : . Dans ma config, j'ai essayé de le modifier pour
: Bearer
mais qui n'est pas le cas donc je dois entrer sur l'INTERFACE utilisateur .OriginalL'auteur Sabir Khan
Le meilleur chemin jusqu'à présent de travailler avec oAuth2 Autorisation est par l'utilisation de Swagger Éditeur, j'ai installé Swagger Éditeur rapidement dans Docker (à partir de ici), puis utilisé le paramètre d'import pour télécharger l'API JSON descripteur (votre API devrait inclure des CORS du filtre), puis je m'Swagger Documentation et une interface où je peux ajouter un jeton qui-je obtenir de l'aide de curl, facteur, ou Firefox reste client.
Le lien qui je suis en utilisant ressemble maintenant à ceci
http://docker.example.com/#/?import=http://mywebserviceapi.example.com:8082/v2/api-docs&no-proxy
l'interface dans le Style de l'Éditeur de saisir le jeton ressemble à ceci:
s'il existe de meilleures solutions, ou une solution de contournement, veuillez poster votre réponse ici.
OriginalL'auteur Hasson
C'est un bug sur swagger-ui 2.6.1 qui envoie vendorExtensions champ d'application à chaque fois. Et qui provoque les demandes de sortir de la portée, les résultats dans les requêtes rejetées. Depuis swagger ne pouvez pas obtenir le jeton d'accès, il ne peut pas passer oauth2
Mise à niveau sur maven devrait résoudre le problème. Version minimale doit être 2.7.0
OriginalL'auteur barisc