ApiCurio (http, порт 8080) работает за Nginx (http, порт 80). F5 (https) пересылает запрос в Nginx. Я могу успешно связать https://github.com , но « _Failed to access External IDP Access Token from Keycloak: 403 - Forbidden_ » ошибка при попытке « Опубликовать API ».
Версия KeyCloak: 3.4.3.Final.
Обратите внимание: я получаю ту же ошибку, даже если удаляю F5 и Nginx с изображения и напрямую работаю с ApiCurio.
_Сообщение об ошибке
Переключить детали : -
io.apicurio.hub.core.exceptions.ServerError: непредвиденная ошибка сервера
в io.apicurio.hub.api.rest.impl.AccountsResource.getOrganizations (AccountsResource.java:241)
в io.apicurio.hub.api.rest.impl.AccountsResource $ Proxy $ _ $$ _ WeldClientProxy.getOrganizations (неизвестный источник)
в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)
в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
в java.lang.reflect.Method.invoke (Method.java:497)
в org.jboss.resteasy.core.MethodInjectorImpl.invoke (MethodInjectorImpl.java:140)
в org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget (ResourceMethodInvoker.java:509)
в org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter (ResourceMethodInvoker.java:399)
в org.jboss.resteasy.core.ResourceMethodInvoker.lambda $ invokeOnTarget $ 0 (ResourceMethodInvoker.java:363)
в org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter (PreMatchContainerRequestContext.java:358)
в org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget (ResourceMethodInvoker.java:365)
в org.jboss.resteasy.core.ResourceMethodInvoker.invoke (ResourceMethodInvoker.java:337)
в org.jboss.resteasy.core.ResourceMethodInvoker.invoke (ResourceMethodInvoker.java:310)
в org.jboss.resteasy.core.SynchronousDispatcher.invoke (SynchronousDispatcher.java:443)
в org.jboss.resteasy.core.SynchronousDispatcher.lambda $ invoke $ 4 (SynchronousDispatcher.java:233)
в org.jboss.resteasy.core.SynchronousDispatcher.lambda $ preprocess $ 0 (SynchronousDispatcher.java:139)
в org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter (PreMatchContainerRequestContext.java:358)
в org.jboss.resteasy.core.SynchronousDispatcher.preprocess (SynchronousDispatcher.java:142)
в org.jboss.resteasy.core.SynchronousDispatcher.invoke (SynchronousDispatcher.java:219)
в org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service (ServletContainerDispatcher.java:227)
в org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service (HttpServletDispatcher.java:56)
в org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service (HttpServletDispatcher.java:51)
в 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)
в io.apicurio.hub.api.security.KeycloakAuthenticationFilter.doFilter (KeycloakAuthenticationFilter.java:72)
в 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)
в 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)
в io.undertow.servlet.core.ManagedFilter.doFilter (ManagedFilter.java:61)
в io.undertow.servlet.handlers.FilterHandler $ FilterChainImpl.doFilter (FilterHandler.java:131)
в io.opentracing.contrib.jaxrs2.server.SpanFinishingFilter.doFilter (SpanFinishingFilter.java:55)
в 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)
в 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)
в org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest (JACCContextIdHandler.java:61)
в io.undertow.server.handlers.PredicateHandler.handleRequest (PredicateHandler.java:43)
в org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest (GlobalRequestControllerHandler.java:68)
в 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)
в org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda $ create $ 0 (SecurityContextThreadSetupAction.java:105)
в org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ create $ 0 (UndertowDeploymentInfoService.java:1502)
в org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ create $ 0 (UndertowDeploymentInfoService.java:1502)
в org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ create $ 0 (UndertowDeploymentInfoService.java:1502)
в 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. выполнить (HttpServerExchange.java:830)
в org.jboss.threads.ContextClassLoaderSavingRunnable.run (ContextClassLoaderSavingRunnable.java:35)
в org.jboss.threads.EnhancedQueueExecutor.safeRun (EnhancedQueueExecutor.java:1985)
в org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.doRunTask (EnhancedQueueExecutor.java:1487)
в org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.run (EnhancedQueueExecutor.java:1378)
в java.lang.Thread.run (Thread.java:745)
Вызвано: io.apicurio.hub.api.connectors.SourceConnectorException: java.io.IOException: неожиданный ответ от Keycloak: 403 :: Forbidden
в io.apicurio.hub.api.connectors.AbstractSourceConnector.getExternalToken (AbstractSourceConnector.java:102)
в io.apicurio.hub.api.github.GitHubSourceConnector.githubClient (GitHubSourceConnector.java:88)
в io.apicurio.hub.api.github.GitHubSourceConnector.getOrganizations (GitHubSourceConnector.java:313)
в io.apicurio.hub.api.github.GitHubSourceConnector $ Proxy $ _ $$ _ WeldClientProxy.getOrganizations (неизвестный источник)
в io.apicurio.hub.api.rest.impl.AccountsResource.getOrganizations (AccountsResource.java:239)
... еще 83
Вызвано: java.io.IOException: неожиданный ответ от Keycloak: 403 :: Forbidden
в io.apicurio.hub.api.security.KeycloakLinkedAccountsProvider.getLinkedAccountToken (KeycloakLinkedAccountsProvider.java:187)
в io.apicurio.hub.api.security.KeycloakLinkedAccountsProvider $ Proxy $ _ $$ _ WeldClientProxy.getLinkedAccountToken (неизвестный источник)
в io.apicurio.hub.api.connectors.AbstractSourceConnector.getExternalToken (AbstractSourceConnector.java:94)
... еще 87
Журнал браузера : -
Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.
Хм. Эта ошибка возникает, когда Apicurio пытается вызвать REST API Keycloak для получения токена доступа GitHub, которым управляет Keycloak. Этот токен необходим, чтобы Apicurio мог выполнять аутентифицированные вызовы GitHub от имени аутентифицированного пользователя.
Навскидку не знаю, почему Keycloak отвечает 403. Есть ли следы стека в журнале сервера Keycloak?
_Приложение GitHub OAuth : -_
_Конфигурация GitHub в KeyCloak: -_
_Связка моей учетной записи GitHub
_Публикация моего API на связанном GitHub: -_
_Журнал KeyCloak: -_
2019-06-25 10: 17: 58,183 WARN [org.keycloak.events] (задача по умолчанию-24) type = IDENTITY_PROVIDER_RETRIEVE_TOKEN_ERROR, realmId = internal, clientId = null, userId = null, ipAddress = 10.aaa.bbb.ccc, error = Клиент [apicurio-studio] не авторизован для получения токенов от поставщика удостоверений [github].
2019-06-25 10: 17: 58,184 ОШИБКА [org.keycloak.services.resources.IdentityBrokerService] (задача по умолчанию-24) Клиент [apicurio-studio] не авторизован для получения токенов от поставщика удостоверений [github].
Вероятно, это связано с тем, что у broker
которая требуется. Ой, подождите - я могу получить настройки от местного KC, который я установил. Вот:
Проверьте эту настройку в вашем царстве KC.
@EricWittmann большое спасибо за ответ на мой вопрос. После добавления роли брокера в свой профиль пользователя я могу публиковать API. Хорошо работает с GitHub и GitLab.
Для тех бедняг, которые оказались здесь из-за ошибки в журнале keycloak: клиент [apicurio-studio] не авторизован для получения токенов от провайдера идентификации [github].
Роль токена чтения может отсутствовать в двух местах:
Самый полезный комментарий
Для тех бедняг, которые оказались здесь из-за ошибки в журнале keycloak: клиент [apicurio-studio] не авторизован для получения токенов от провайдера идентификации [github].
Роль токена чтения может отсутствовать в двух местах: