Docker环境下Symfony项目中为KnpU OAuth2 Client配置Keycloak双URL的方法
Docker环境下Symfony项目中为KnpU OAuth2 Client配置Keycloak双URL的方法
我目前在维护一个Symfony项目,API和前端模块都是基于Symfony搭建的,而且全部都Docker化部署了,另外还有一个运行在Docker容器里的Keycloak身份认证服务。相信很多做过类似架构的朋友都遇到过同一个坑:外部用户访问Keycloak得用宿主机地址或者公网域名,但Symfony容器内部调用Keycloak如果也用外部URL,要么会出现网络不通的问题,要么会绕远路拖慢请求速度。
在我的Symfony前端项目里,我用KnpU OAuth2 Client Bundle来对接Keycloak,这里就分享一下配置双URL的具体解决方法:
首先,在项目的.env文件里定义两个环境变量,分别对应外部可访问的Keycloak地址和Docker内部容器间通信的地址:
# 外部用户访问Keycloak的URL(比如你的宿主机IP+端口,或者已备案的域名) OAUTH_KEYCLOAK_EXTERNAL_URL=http://localhost:8080 # Docker内部容器间访问的URL(用Docker Compose里定义的Keycloak服务名,比如服务名叫keycloak的话就是http://keycloak:8080) OAUTH_KEYCLOAK_INTERNAL_URL=http://keycloak:8080 # 你的Keycloak Realm名称 OAUTH_KEYCLOAK_REALM=your-project-realm
接着在config/packages/knpu_oauth2_client.yaml里配置Keycloak客户端,同时指定外部授权URL和内部API调用URL:
knpu_oauth2_client: clients: keycloak: type: keycloak client_id: '%env(OAUTH_KEYCLOAK_CLIENT_ID)%' client_secret: '%env(OAUTH_KEYCLOAK_CLIENT_SECRET)%' redirect_route: connect_keycloak_check # 给用户浏览器跳转授权用的外部URL,确保前端能正常访问到Keycloak auth_server_url: '%env(OAUTH_KEYCLOAK_EXTERNAL_URL)%' # 容器内部调用Keycloak API用的内部URL,保证容器间网络连通且请求高效 base_url: '%env(OAUTH_KEYCLOAK_INTERNAL_URL)%' realm: '%env(OAUTH_KEYCLOAK_REALM)%'
这样配置之后,用户在前端点击登录跳转Keycloak授权页面时,会用外部可访问的URL,不会出现浏览器无法访问的情况;而Symfony容器在后台请求token、拉取用户信息等操作时,会直接用Docker内部的服务地址,既稳定又高效。
最后要提一句,得确保你的Symfony容器和Keycloak容器在同一个Docker网络下,这样内部服务名才能正常解析哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

