В 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. Все работало очень хорошо, когда я использую имена компьютеров (имена хостов докера A.K.A.) в качестве ссылки во всех конфигурационных файлах. Все, что мне нужно, это добавить все имена хостов Docker в мой собственный файл хостов, и я смог найти всех, используя мой браузер, а внутри docker связь была также выполнена с использованием имен хостов docker.
Мои проблемы начались, когда я изменил ссылку на сервер OAuth2 на полное доменное имя (например, с «server» на «server.oauth.com»).
Я просто изменяю запись "server" в файле hosts (на моем компьютере) на "server.oauth.com", и мой браузер все еще может найти сервер OAuth.
Что ж, клиентское приложение больше не может использовать конечную точку "/ me", потому что клиентская докерная машина не знает ни о каком "server.oauth.com" и вызывает бесконечное перенаправление на конечную точку входа в систему, поэтому мой браузер жалуется на "TOO_MANY_REDIRECTS "и остановка без авторизации (после отправки формы авторизации).
Это файл application.yml
моего клиентского приложения:
Эта конфигурация работает, потому что все машины могут разрешить server
. Docker-машины разрешаются с помощью внутреннего DNS, а мой компьютер - с помощью моего hosts file
, указывающего на IP-адрес хоста Docker:
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
Эта конфигурация НЕ РАБОТАЕТ, потому что я могу решить server.oauth.com
, используя мой файл hosts так же, как и раньше, но машины 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-адрес изменится (что, если изменится хост-машина докера его 'IP-адрес?).
Каков наилучший способ решить эту проблему?