我在Spring Boot中实现了OAuth2服务器。
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
//blah blah
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.realm( REALM+"/client" );
oauthServer.passwordEncoder( passwordEncoder );
oauthServer.checkTokenAccess( "permitAll()" );
}
}
在我的开发环境中,它与我的客户(Spring Boot也是如此)一起很好地工作。
现在我需要将所有这些都放置在Docker环境中。如果我在所有配置文件中都使用机器名称(又名docker主机名)作为参考,那么一切运行得很好。我需要做的就是将所有Docker主机名添加到我自己的计算机hosts文件中,我能够使用我的浏览器找到每个人,并且在docker内部,通讯也是使用docker主机名进行的。
当我将OAuth2服务器引用更改为完整域名(例如,从“服务器”更改为“ server.oauth.com”)时,麻烦就开始了。
我只是将主机文件(我的机器)中的“服务器”条目更改为“ server.oauth.com”,并且我的浏览器仍然能够找到OAuth服务器。
嗯,客户端应用程序无法再使用“ / me”端点,因为客户端Docker机器不知道任何“ server.oauth.com”并导致无限重定向到登录端点,因此我的浏览器抱怨“ TOO_MANY_REDIRECTS” ”,然后停止而不登录(在提交登录表单之后)。
这是我的客户端应用程序的application.yml
文件:
此配置有效,因为所有计算机都可以解析server
。 Docker计算机通过使用内部DNS进行解析,而我的计算机通过使用自己的hosts file
来指向Docker主机的IP地址进行解析:
security:
basic:
enabled: false
oauth2:
client:
clientId: cliente01
clientSecret: secret
accessTokenUri: http://server:port/oauth/token
userAuthorizationUri: http://server:port/oauth/authorize
resource:
userInfoUri: http://server:port/user/me
该配置无效,因为我可以像以前一样使用hosts文件来解析server.oauth.com
,但是Docker机器无法解析它。因此无法找到/me
中的userInfoUri
端点(客户端计算机在内部使用该端点向服务器询问有关用户数据的信息)
security:
basic:
enabled: false
oauth2:
client:
clientId: cliente01
clientSecret: secret
accessTokenUri: http://server.oauth.com:port/oauth/token
userAuthorizationUri: http://server.oauth.com:port/oauth/authorize
resource:
userInfoUri: http://server.oauth.com:port/user/me
我已经尝试将映射放入docker run
参数--add-host=server.oauth.com:<DOCKER_HOST_IP>
中(是的,这使事情开始起作用),但是我担心IP将来会发生变化(如果docker主机更改其IP地址?)。
解决此问题的最佳方法是什么?