Docker容器中Micronaut登录重定向至Keycloak主机别名问题
解决方案:分离Keycloak内部通信地址与外部重定向地址
Micronaut的OAuth2配置支持分别设置内部用于API调用的Keycloak地址和外部用于前端重定向的地址,无需修改hosts或额外代理,直接通过配置文件即可实现轻量化解决。
1. 修改Micronaut配置文件(application.yml/properties)
针对Keycloak的OAuth2客户端,拆分配置内部通信和外部重定向的不同地址:
micronaut: security: oauth2: clients: keycloak: # Docker内部服务间通信的Keycloak地址 issuer: "http://keycloak:9080/realms/你的Realm名称" # 自定义外部可访问的OAuth2端点 configuration: authorization_endpoint: "http://localhost:9080/realms/你的Realm名称/protocol/openid-connect/auth" token_endpoint: "http://keycloak:9080/realms/你的Realm名称/protocol/openid-connect/token" jwks_uri: "http://keycloak:9080/realms/你的Realm名称/protocol/openid-connect/certs"
配置说明
issuer:保持Docker内部的keycloak:9080,用于Micronaut后台验证token、获取密钥等服务间操作。authorization_endpoint:设置为主机可访问的localhost:9080,确保登录重定向地址能被外部正常解析。token_endpoint和jwks_uri:继续使用内部地址,因为是服务后台与Keycloak的私密通信,不需要外部访问。
2. 确认Keycloak客户端回调配置
登录Keycloak控制台,确保对应客户端的Valid Redirect URIs包含你的Micronaut服务外部可访问地址,例如:http://localhost:8081/*
3. Docker Compose配套配置(可选)
如果用Docker Compose管理服务,确保两者处于同一网络,并通过环境变量加载专属配置:
version: '3.8' services: keycloak: image: quay.io/keycloak/keycloak:latest ports: - "9080:8080" environment: KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin command: start-dev networks: - app-network micronaut-service: build: . ports: - "8081:8081" environment: MICRONAUT_ENVIRONMENTS: docker networks: - app-network networks: app-network: driver: bridge
可将前面的OAuth2配置放在application-docker.yml中,通过MICRONAUT_ENVIRONMENTS: docker加载,实现本地运行与Docker运行的配置隔离。
4. 验证效果
启动Docker服务后,访问http://localhost:8081触发登录,重定向地址会自动指向http://localhost:9080,主机可正常解析完成登录流程,同时Micronaut后台仍通过Docker内部地址与Keycloak通信。
内容的提问来源于stack exchange,提问作者John M
相关产品推荐
相关产品推荐

