ApiCurio (http, port 8080) s'exécute derrière Nginx (http, port 80). Le F5 (https) transmet la demande à Nginx. Je peux lier avec succès https://github.com , mais " _Échec d'accès au jeton d'accès IDP externe à partir de Keycloak: 403 - Forbidden_ " en essayant de " Publier l'API ".
Version KeyCloak : 3.4.3.Final.
Veuillez noter que j'obtiens la même erreur même si je supprime F5 et Nginx de l'image et traite directement avec ApiCurio.
_Message d'erreur :-_
Basculer les détails :-
io.apicurio.hub.core.exceptions.ServerError : erreur de serveur inattendue
à io.apicurio.hub.api.rest.impl.AccountsResource.getOrganizations(AccountsResource.java:241)
à io.apicurio.hub.api.rest.impl.AccountsResource$Proxy$_$$_WeldClientProxy.getOrganizations(Source inconnue)
à sun.reflect.NativeMethodAccessorImpl.invoke0 (méthode native)
à sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
à sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
à java.lang.reflect.Method.invoke(Method.java:497)
sur org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:140)
sur org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:509)
sur org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:399)
sur org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:363)
sur org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358)
sur org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:365)
sur org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:337)
sur org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:310)
sur org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:443)
sur org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:233)
sur org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:139)
sur org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358)
sur org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:142)
à org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:219)
sur org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:227)
sur org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
sur org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
sur javax.servlet.http.HttpServlet.service(HttpServlet.java:791)
à io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
à io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
sur io.apicurio.hub.api.security.KeycloakAuthenticationFilter.doFilter(KeycloakAuthenticationFilter.java:72)
sur io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
à io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
à io.apicurio.hub.api.filters.DisableCachingFilter.doFilter(DisableCachingFilter.java:66)
sur io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
à io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
à io.apicurio.hub.api.filters.CorsFilter.doFilter(CorsFilter.java:64)
sur io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
à io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
sur io.opentracing.contrib.jaxrs2.server.SpanFinishingFilter.doFilter(SpanFinishingFilter.java:55)
sur io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
à io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
à io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
à io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
à io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
à io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
à org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
à io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
sur org.keycloak.adapters.undertow.UndertowAuthenticatedActionsHandler.handleRequest(UndertowAuthenticatedActionsHandler.java:66)
à io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
à io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
à io.undertow.server.handlers.DisableCacheHandler.handleRequest(DisableCacheHandler.java:33)
à io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
à io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)
à io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
à io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
à io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)
à io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
à io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
à io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
à io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
à io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
sur org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
à io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
sur org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
sur org.keycloak.adapters.undertow.ServletPreAuthActionsHandler.handleRequest(ServletPreAuthActionsHandler.java:69)
à io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
à io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
à io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
à io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
à io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
à io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
à io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
sur org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
sur org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
sur org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
sur org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
sur org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
à io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
à io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
à io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
à io.undertow.server.Connectors.executeRootHandler(Connectors.java:360)
à io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
sur org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
sur org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
sur org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
sur org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
à java.lang.Thread.run(Thread.java:745)
Causé par : io.apicurio.hub.api.connectors.SourceConnectorException : java.io.IOException : réponse inattendue de Keycloak : 403::Forbidden
à io.apicurio.hub.api.connectors.AbstractSourceConnector.getExternalToken(AbstractSourceConnector.java:102)
à io.apicurio.hub.api.github.GitHubSourceConnector.githubClient(GitHubSourceConnector.java:88)
sur io.apicurio.hub.api.github.GitHubSourceConnector.getOrganizations(GitHubSourceConnector.java:313)
à io.apicurio.hub.api.github.GitHubSourceConnector$Proxy$_$$_WeldClientProxy.getOrganizations (Source inconnue)
à io.apicurio.hub.api.rest.impl.AccountsResource.getOrganizations(AccountsResource.java:239)
... 83 de plus
Causé par : java.io.IOException : réponse inattendue de Keycloak : 403::Forbidden
sur io.apicurio.hub.api.security.KeycloakLinkedAccountsProvider.getLinkedAccountToken(KeycloakLinkedAccountsProvider.java:187)
sur io.apicurio.hub.api.security.KeycloakLinkedAccountsProvider$Proxy$_$$_WeldClientProxy.getLinkedAccountToken (Source inconnue)
à io.apicurio.hub.api.connectors.AbstractSourceConnector.getExternalToken(AbstractSourceConnector.java:94)
... 87 de plus
Le journal du navigateur
S'il vous plaît laissez-moi savoir si vous avez besoin d'informations supplémentaires.
Hum. Cette erreur se produit lorsqu'Apicurio tente d'appeler une API REST Keycloak pour récupérer le jeton d'accès GitHub géré par Keycloak. Ce jeton est nécessaire pour qu'Apicurio puisse passer des appels authentifiés à GitHub au nom de l'utilisateur authentifié.
Je ne sais pas pourquoi Keycloak répond avec un 403. Y a-t-il des traces de pile dans le journal du serveur Keycloak ?
_Application OAuth GitHub :-_
_Configuration GitHub dans KeyCloak :-_
_Lier mon compte GitHub
_Publier mon API sur le GitHub lié
_Journal KeyCloak : -_
2019-06-25 10:17:58,183 WARN [org.keycloak.events] (tâche par défaut-24) type=IDENTITY_PROVIDER_RETRIEVE_TOKEN_ERROR, realmId=internal, clientId=null, userId=null, ipAddress=10.aaa.bbb.ccc, error=Le client [apicurio-studio] n'est pas autorisé à récupérer les jetons du fournisseur d'identité [github].
2019-06-25 10:17:58,184 ERREUR [org.keycloak.services.resources.IdentityBrokerService] (tâche par défaut-24) Le client [apicurio-studio] n'est pas autorisé à récupérer les jetons du fournisseur d'identité [github].
Cela est probablement dû au fait qu'il manque un rôle requis au client apicurio-studio (dans Keycloak). Je n'ai pas accès aux détails pour le moment (je voyage) mais de mémoire, il y a un rôle broker
quelconque qui est requis. Oh, attendez - je peux obtenir le paramètre à partir d'un KC local que j'ai installé. C'est ici:
Vérifiez ce paramètre dans votre domaine KC.
@EricWittmann merci beaucoup d'avoir répondu à ma question. Après avoir ajouté le rôle de courtier dans mon profil utilisateur, je suis en mesure de publier des API. Fonctionne bien avec GitHub et GitLab.
Pour ces pauvres âmes qui se retrouvent ici à cause de l'erreur dans le journal de keycloak : le client [apicurio-studio] n'est pas autorisé à récupérer les jetons du fournisseur d'identité [github].
Le rôle de jeton de lecture peut être manquant à deux endroits :
Commentaire le plus utile
Pour ces pauvres âmes qui se retrouvent ici à cause de l'erreur dans le journal de keycloak : le client [apicurio-studio] n'est pas autorisé à récupérer les jetons du fournisseur d'identité [github].
Le rôle de jeton de lecture peut être manquant à deux endroits :