我有一些JHipster Spring微服务和网关项目。我使用除网关之外的docker将所有这些部署在主机上。我在另一台主机上启动了网关。
我使用Keycloak进行OAuth身份验证。
当我使用docker-compose将所有微服务和数据库以及网关作为docker容器部署在docker网络上时,一切正常。
但是当我只在docker上部署除了gateway之外的所有内容时它不起作用.i意味着如果网关位于docker创建的网络之外。这个动作的动机是我只希望我的UI程序员在他自己的PC上启动并运行网关,并使用部署在服务器主机上的微服务。只是为了便于使用gradle bootRun -Pprod
启动和运行这个唯一网关的UI开发。
我使用了一种技术为docker网络上的每个容器分配一个单独的IP。这种技术称为Docker MacVLan网络。这样主机中的每个容器在物理网络中都有一个单独的IP地址,并且每个容器在网络中的其他主机上都可见。
问题是在正常的docker部署中(当网关部署在同一主机的docker网络中时)一切正常。但在我成功登录后的场景中,每个微服务都返回error 401
。
在微服务中它说这个错误:
o.s.s.oauth2.client.OAuth2RestTemplate : Setting request Accept header to [application/json, application/x-jackson-smile, application/cbor, application/*+json]
o.s.s.oauth2.client.OAuth2RestTemplate : GET request for "http://keycloak:9080/auth/realms/jhipster/protocol/openid-connect/userinfo" resulted in 401 (Unauthorized); invoking error handler
n.m.b.s.o.CachedUserInfoTokenServices : Could not fetch user details: class org.springframework.security.oauth2.client.resource.OAuth2AccessDeniedException, Unable to obtain a new access token for resource 'null'. The provider manager is not configured to support it.
p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error="invalid_token", error_description="token string here"
它说你的令牌无效。当所有内容部署在docker中的同一主机中时,相同的机制才有效。是否为Keycloak阻止令牌验证外部主机?我个人对此表示怀疑,因为它并没有阻止我成功登录网关。我刚刚检查过keycloak。由命令-b 0.0.0.0
起来
请帮助我,并通过gradle bootRun -Pprod
运行一个网关。
总之,我可以将我的问题改为:我只希望UI Developer能够在其自己的PC中测试他的角度/弹簧网关项目,而其他服务使用docker部署在功能强大的服务器中(使用Keycloak进行身份验证)。并且无法在UI开发人员自己的PC上部署这些其他服务。怎么在JHipster中做到这一点?
投票
使用网关时,将server.use-forward-headers = true添加到您的配置中