如何在 Docker 容器中使用 Spring Boot 应用程序获取 keycloak 领域证书

问题描述 投票:0回答:2

这是我的 docker-compose.yml 文件:

  version: "3.7"
    
    volumes:
      pgdata:
        driver: local
    
    
    services:
      database:
        container_name: postgres-realityquest-db
        image: postgres:${POSTGRES_VERSION}
        ports:
          - "5432:5432"
        environment:
          - POSTGRES_USER=${POSTGRES_USER}
          - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
          - POSTGRES_DB=${POSTGRES_DB}
          - PGDATA=/var/lib/postgresql/data
        volumes:
          - pgdata:/var/lib/postgresql/data
    
      app:
        image: reality-quest
        container_name: app
        depends_on: [database, keycloak]
        ports:
          - "8081:8081"
      
      keycloak:
        image: jboss/keycloak
        container_name: local-keycloak
        ports:
          - "8024:8080"
        volumes:
          - ./imports:/tmp/import
        environment:
          - KEYCLOAK_USER=admin
          - KEYCLOAK_PASSWORD=admin
        command:
          - "-Dkeycloak.migration.action=import"
          - "-Dkeycloak.migration.provider=dir"
          - "-Dkeycloak.migration.dir=/tmp/import"

这是我的 application.properties 文件:

 server.port=8081
    #POSTGRESSQL DATASOURCE CONFIGURATION
    spring.datasource.driver-class-name=org.postgresql.Driver
    spring.datasource.url=jdbc:postgresql://postgres-realityquest-db:5432/test
    #spring.datasource.url=jdbc:postgresql://localhost:5432/test
    spring.datasource.username=postgres
    spring.datasource.password=root
    
    #HIBERNATE CONFIGURATION
    spring.jpa.hibernate.ddl-auto=validate
    spring.jpa.show-sql=true
    spring.main.allow-bean-definition-overriding=true
    
    #LIQUIBASE CONFIGURATION
    spring.liquibase.change-log=db/changelog/db.changelog-master.xml
    
    #SECURITY CONFIGURATION
    spring.security.filter.order=10
    
    #RESOURCE SERVER CONFIGURATION
    spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://localhost:8024/auth/realms/custom-oauth2-server/protocol/openid-connect/certs

当容器运行时,我可以使用 POSTMAN 从 keycloak 成功获取 JWT 令牌,但是当我向 API 发送请求时出现获取错误:

org.springframework.security.authentication.AuthenticationServiceException: An error occurred while attempting to decode the Jwt: Couldn't retrieve remote JWK set: org.springframework.web.client.ResourceAccessException
: I/O error on GET request for "http://localhost:8024/auth/realms/custom-oauth2-server/protocol/openid-connect/certs": Connection refused; nested exception is java.net.ConnectException: Connection refused

当我在没有 Docker 的情况下执行此操作时,一切正常。 我将不胜感激您的帮助

java spring docker-compose oauth-2.0 keycloak
2个回答
0
投票

首先检查jwks_uri的url是否正确,发现到达了这个url:

 http://keycloakhost:keycloakport/auth/realms/{realm}/.well-known/openid-configuration

在 json 结果中你将看到 jwks_uri


0
投票

Keycloak 版本 - 22.0.4

将容器从本地环境放入 kubernetes (minikube) 环境后,我遇到了此错误(在 Spring Boot 应用程序控制台上)。

区别:Spring Boot应用程序连接到集群网络内的Keycloak。 Spring Boot Security 使用

security: oauth2: resourceserver: jwt: jwk-set-uri: $(my_jwk-set-uri_variable)
连接到 keycloak。 $(my_jwk-set-uri_variable) 需要是集群地址。

这可以是服务的名称或服务的 IP。
(对于 Kubernetes:kubectl get service 显示集群 IP 地址。)

格式: jwk-set-uri:http://>/realms//protocol/openid-connect/certs


相关问题:

security: oauth2: resourceserver: jwt: issuer-uri: $(my_issuer-uri_variable)
必须是令牌中的 iss 变量。令牌可以通过以下方式解码:https://jwt.io/.

© www.soinside.com 2019 - 2024. All rights reserved.