当前位置: 首页 > 知识库问答 >
问题:

密钥斗篷适配器在将 Springboot Webapp 部署到 Docker 时无法验证令牌

周翰池
2023-03-14

我正在开发一个在Tomcat上运行的Springboot应用程序和React前端,以及Hasura Graphql和Keycloak。所有 3 个项目都在一个 Docker 堆栈中运行,具有以下 stack.yml:

version: '3.7'

services:
  timescale-primary:
    image: timescale-replication:latest
    env_file:
      - primary.env
    networks:
      - public-network
    ports:
      - 5432:5432
    volumes:
      - timescale-primary-storage:/var/lib/postgresql/data
    deploy:
      placement:
        constraints:
          - node.labels.type == primary

  timescale-replica:
    image: timescale-replication:latest
    env_file:
      - replica.env
    networks:
      - public-network
    volumes:
      - timescale-replica-storage:/var/lib/postgresql/data
    deploy:
      placement:
        constraints:
          - node.labels.type != primary

  hasura:
    image: hasura/graphql-engine
    networks:
      - public-network
    ports:
      - 6080:8080
    env_file:
      - hasura.env
    volumes:
      - hasura-storage:/var/lib/hasura
    depends_on:
      - timescale-primary

  keycloak:
    image: keycloak
    networks:
      - public-network
    ports:
      - 9080:8080
    env_file:
      - keycloak.env
    volumes:
      - keycloak-storage:/opt/jboss/keycloak/themes
    depends_on:
      - timescale-primary

  tomcat:
    image: tomcat:v1
    networks:
      - public-network
    ports:
      - 8086:8080
    volumes:
      - tomcat-storage:/usr/local/tomcat/webapps:Z
      - tomcat-log-storage:/var/log/tomcat:Y

networks:
  public-network:

volumes:
  timescale-primary-storage:
  timescale-replica-storage:
  hasura-storage:
  keycloak-storage:
  tomcat-storage:
  tomcat-log-storage:

SpringBoot webapp是一个运行在http://tomcat:8080/backend,并且React应用程序部署在http://tomcat:8080/ui.

在Hasura中,我设置了一个指向该服务器的远程模式:超文本传输协议://tomcat: 8080/backend/graph ql,并转发了所有客户端标头。

基本上,React 应用程序通过 Hasura 间接访问“后端”。

在Keycloak中,我为“ui”应用程序设置了一个公共客户端,为“后端”应用程序设置了一个机密客户端。

然后,我得到身份验证流程,如下所示:

  1. 在 Docker 的主机上,调用 http://localhost:8086/ui
  2. 转发到本地主机:9080/身份验证/...(钥匙斗篷的登录屏幕)
  3. 登录成功后,重定向到“ui”应用
  4. React 应用程序调用 Hasura
  5. Hasura 调用“后端”并获取“验证令牌失败”、“授权标头无效,有关详细信息,请参阅 WWW-身份验证标头”
2019-12-09 02:47:59.163 DEBUG 1 --- [io-8080-exec-30] o.k.adapters.PreAuthActionsHandler       : adminRequest http://tomcat:8080/backend/graphql
2019-12-09 02:47:59.164 DEBUG 1 --- [io-8080-exec-30] f.KeycloakAuthenticationProcessingFilter : Request is to process authentication
2019-12-09 02:47:59.164 DEBUG 1 --- [io-8080-exec-30] f.KeycloakAuthenticationProcessingFilter : Attempting Keycloak authentication
2019-12-09 02:47:59.165 TRACE 1 --- [io-8080-exec-30] o.k.adapters.RequestAuthenticator        : --> authenticate()
2019-12-09 02:47:59.165 TRACE 1 --- [io-8080-exec-30] o.k.adapters.RequestAuthenticator        : try bearer
2019-12-09 02:47:59.165 DEBUG 1 --- [io-8080-exec-30] o.k.a.BearerTokenRequestAuthenticator    : Found [1] values in authorization header, selecting the first value for Bearer.
2019-12-09 02:47:59.165 DEBUG 1 --- [io-8080-exec-30] o.k.a.BearerTokenRequestAuthenticator    : Verifying access_token
2019-12-09 02:47:59.165 TRACE 1 --- [io-8080-exec-30] o.k.a.BearerTokenRequestAuthenticator    :        access_token: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJyb1NzQ2I1VWJPeDYyZHltWThzUm9qR2lGMHpINDJXQWdOU0JFd0Q2TEFFIn0.eyJqdGkiOiIyOWJlZmQ4MC04NGU3LTQ5NzMtOGQyMS0zOWE3ZTZiZjZiMjMiLCJleHAiOjE1NzU4NTk5NzksIm5iZiI6MCwiaWF0IjoxNTc1ODU5Njc5LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjkwODAvYXV0aC9yZWFsbXMvdGQyMSIsInN1YiI6ImRlNWM2NjRhLWY0NTQtNDI0NC05OTY4LWJmYzAwZDg2YjA2ZSIsInR5cCI6IkJlYXJlciIsImF6cCI6InRkMjEtd2ViLXVpIiwibm9uY2UiOiJmZWE1NjE4My1kNDE2LTQ3NTktOWI0Yi1kNzI1NTVjZTA5OTAiLCJhdXRoX3RpbWUiOjE1NzU4NTg5NDksInNlc3Npb25fc3RhdGUiOiJiMmY2MjBhMC00MDRjLTRiYTctOGNlYy04OGQ2Y2Y3MDZmZmUiLCJhY3IiOiIwIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIkFETUlOIl19LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiJ9.signature
2019-12-09 02:47:59.167 DEBUG 1 --- [io-8080-exec-30] o.k.a.BearerTokenRequestAuthenticator    : Failed to verify token
2019-12-09 02:47:59.167 DEBUG 1 --- [io-8080-exec-30] o.k.adapters.RequestAuthenticator        : Bearer FAILED
2019-12-09 02:47:59.167 DEBUG 1 --- [io-8080-exec-30] f.KeycloakAuthenticationProcessingFilter : Auth outcome: FAILED
2019-12-09 02:47:59.167 DEBUG 1 --- [io-8080-exec-30] f.KeycloakAuthenticationProcessingFilter : Authentication request failed: org.keycloak.adapters.springsecurity.KeycloakAuthenticationException: Invalid authorization header, see WWW-Authenticate header for details

org.keycloak.adapters.springsecurity.KeycloakAuthenticationException: Invalid authorization header, see WWW-Authenticate header for details
        at org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter.attemptAuthentication(KeycloakAuthenticationProcessingFilter.java:158) ~[keycloak-spring-security-adapter-7.0.0.jar:7.0.0]

如果我把React和Springboot应用程序放在一个直接安装在Docker主机上的Tomcat中,后端的认证就没问题了。只有当所有东西都部署到Docker中时,才会出现此问题。

我是Keycloak和Docker的新手,感谢任何帮助。

共有1个答案

缪嘉志
2023-03-14

为了使身份验证工作,React应用程序和springboot应用程序的Keycloak URL需要相同。也就是说,您不能对一个使用localhost,而对另一个使用Docker容器名称。

在我的情况下,可以使用公共IP或实际域名。

 类似资料:
  • 我有java REST应用程序,我希望通过keycloak保护。我做了一些测试,应用程序与keycloak servlet过滤器配合良好,但我在Spring Security适配器方面遇到了问题。 钥匙斗篷。json(删除值) 可见,我只需要承载授权,若请求包含有效令牌,那个么若不是http 401,那个么我希望是http 200。我使用了以下xml配置: 到底发生了什么?请求经过身份验证,但成功

  • 我正试图在我的spring boot应用程序中使用KeyClope。 我想根据REST方法和用户角色限制对特定URL的访问。 在下面的示例中,具有或角色的用户可以执行GET,而具有或角色的用户可以执行POST、PUT或DELETE。 不幸的是,此配置允许任何经过身份验证的用户访问/api/日历URL。我做错了什么?

  • 我有一个需要联合到IDP的需求。我过去从未遇到过问题,在这种情况下,我遇到了问题,因为第三方/外部IDP启用并实施了PKCE。 有没有办法联合到启用了PKCE的IDP。基本上换句话说,我应该能够转发/发送code_challenge和code_challenge_method给外部 IDP。我可以在我的 IDP 上启用 PKCE,而不会出现任何问题,并在需要时将相同的标头转发给外部 IDP,但我看

  • 我正在尝试在API网关(Apache APISIX)后面使用KeyClope。 我使用minikube来运行KeyClope和API网关。 网关正常工作,KeyClope也正常工作: 使用KeyClope,我可以使用不同的endpoint(使用发现endpoint(http://127.0.0.1:7070/auth/realms/myrealm/.well-已知/uma2配置),询问访问令牌并进

  • 我想设置一个Docker网络,其中包含keyCloak、postgres和webapp实例。 有没有一种方法可以在容器之间进行网络通信,同时也理解oidc客户端重定向?我有一个问题,容器可以互相交谈只是罚款,如果我设置OIDC容器名称为docker网络,但然后我遇到的问题与客户端,不能连接到这些相同的URL以外的docker网络在主机上机器。 有人能给我指出正确的docker留档来寻找DNS或主机

  • 我正在尝试编写一个定制的KeyClope验证器,该验证器可以从某个请求中检索用户凭据,并动态提交这些凭据进行身份验证,而最终用户不必手动将它们输入某个登录表单。 以这个问题为起点,我在KeyCloak中创建了自己的自定义身份验证SPI。我还根据需要配置了KeyCloak身份验证流。 自定义验证器 自定义验证器工厂 下面是我的自定义登录表单,它基于这里的KeyClope“secret questio