Apicurio-studio: 发布 API 时出错

创建于 2019-06-24  ·  5评论  ·  资料来源: Apicurio/apicurio-studio

ApiCurio(http,端口 8080)在 Nginx(http,端口 80)后面运行。 F5 (https) 将请求转发到 Nginx。 我可以成功链接https://github.com ,但是在尝试“发布 API ”时出现“ _Failed to access External IDP Access Token from Keycloak: 403 - Forbidden_ ”错误。

KeyCloak 版本:3.4.3.Final。

请注意,即使我从图片中删除 F5 和 Nginx 并直接处理 ApiCurio,我也会收到同样的错误。

_错误信息:-_
image

切换详细信息:-

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(Native Method)
在 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.run(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 更多

浏览器日志:-
image

如果您需要任何其他信息,请告诉我。

bug question

最有用的评论

对于那些因为 keycloak 日志中的错误而在这里结束的可怜人:客户端 [apicurio-studio] 无权从身份提供者 [github] 检索令牌。

read-token 角色可能在两个地方缺失:

  1. broker的客户端默认角色:默认添加read-token broker;
  2. 现有用户:添加角色(用户->[用户]->角色映射)。 选择客户端角色代理。 分配读取令牌角色。

所有5条评论

嗯。 当 Apicurio 尝试调用 Keycloak REST API 以检索 Keycloak 正在管理的 GitHub 访问令牌时,会发生此错误。 需要此令牌,以便 Apicurio 可以代表经过身份验证的用户对 GitHub 进行经过身份验证的调用。

我不知道为什么 Keycloak 以 403 响应。Keycloak 服务器日志中是否有任何堆栈跟踪?

_GitHub OAuth应用程序:-_
image

_KeyCloak 中的 GitHub 配置:-_
image

_链接我的 GitHub帐户:-_
image

_将我的 API 发布到链接的GitHub:-_
image

_KeyCloak 日志:-_

2019-06-25 10:17:58,183 WARN [org.keycloak.events] (默认 task-24) type=IDENTITY_PROVIDER_RETRIEVE_TOKEN_ERROR,realmId=internal,clientId=null,userId=null,ipAddress=10.acaa.bbb.c错误=客户端 [apicurio-studio] 无权从身份提供者 [github] 检索令牌。
2019-06-25 10:17:58,184 错误 [org.keycloak.services.resources.IdentityBrokerService](默认 task-24)客户端 [apicurio-studio] 无权从身份提供者 [github] 检索令牌。

这可能是因为apicurio-studio客户端(在 Keycloak 中)缺少必需的角色。 我现在无法访问详细信息(我正在旅行),但是根据记忆,需要某种broker角色。 哦等等 - 我可以从我安装的本地 KC 获取设置。 这里是:

image

检查您的 KC 领域中的设置。

@EricWittmann 非常感谢您回答我的问题。 在我的用户配置文件中添加代理角色后,我可以发布 API。 适用于 GitHub 和 GitLab。

对于那些因为 keycloak 日志中的错误而在这里结束的可怜人:客户端 [apicurio-studio] 无权从身份提供者 [github] 检索令牌。

read-token 角色可能在两个地方缺失:

  1. broker的客户端默认角色:默认添加read-token broker;
  2. 现有用户:添加角色(用户->[用户]->角色映射)。 选择客户端角色代理。 分配读取令牌角色。
此页面是否有帮助?
0 / 5 - 0 等级