这是我的 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 的情况下执行此操作时,一切正常。 我将不胜感激您的帮助
首先检查jwks_uri的url是否正确,发现到达了这个url:
http://keycloakhost:keycloakport/auth/realms/{realm}/.well-known/openid-configuration
在 json 结果中你将看到 jwks_uri
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://
相关问题:
security: oauth2: resourceserver: jwt: issuer-uri: $(my_issuer-uri_variable)
必须是令牌中的 iss 变量。令牌可以通过以下方式解码:https://jwt.io/.