我有一些JHipster Spring Microservice和网关项目。我将所有这些网关(网关除外)部署在使用docker的主机上。我在另一台主机上启动了网关。
我使用Keycloak进行OAuth身份验证。
当我使用docker-compose在docker网络上将所有微服务和数据库以及网关作为docker容器部署时,一切工作正常。
但是当我只是将所有东西部署在docker上而不是网关上时,它是行不通的。我的意思是网关是否位于docker创建的网络之外。这样做的动机是我只希望UI程序员在自己的PC上启动并运行网关,并使用部署在服务器主机上的微服务。只是为了简化UI开发,需要使用gradle bootRun -Pprod
来启动和运行这个唯一的网关。
我使用了一种技术来为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阻止令牌验证外部主机的吗?我个人对此表示怀疑,因为它并不能阻止我成功登录网关。我只是检查了钥匙斗篷。通过命令-b 0.0.0.0
请通过gradle bootRun -Pprod
来帮助我并运行网关。
总而言之,我可以将问题改写为: 我只希望UI Developer能够在自己的PC中测试其angular / spring-gateway项目,而其他服务则使用docker < / em> (使用 Keycloak 进行身份验证)。并且不可能在UI开发人员自己的PC上部署这些其他服务。在JHipster中怎么做?
答案 0 :(得分:0)
在使用网关时将server.use-forward-headers = true添加到您的配置