Я работаю над этим уже несколько месяцев.Я думаю, что я действительно близко.Моя цель: использовать шлюз Zuul для обслуживания микро сервисов.Поместите фильтр OAuth2 на шлюз Zuul для защиты микро сервисов.Поставщик OAuth2 - это Azure B2C.Я думаю, что я использую OIDC и JWT.Все мои Zuul и сервисы работают на одной машине, на разных портах.
PS Я планирую использовать Spring Session или Redis для общего доступа к сеансу между всеми микро сервисами.
Когда я отправляю запросмой Zuul, который является localhost: 8762 / res / images.Я был перенаправлен на страницу входа B2C.После того, как я войду с моим именем пользователя, пароль.Я перенаправлен обратно на localhost: 8762 / логин.с очень длинным атрибутом кода.Я предполагаю, что это либо код auth_code, либо токен JWT.Также есть атрибут state = IuvHq6.Не уверен, что это такое.Веб-страница дает мне статус 401, не удалось получить токен доступа.
Шлюз
Zuul шлюз POM gist
Spring Cloud Edgware.SR4
стартер весенней загрузки web 1.5.13
стартер облака весны eureka 1.4.5
стартер облака весны zuul 1.4.5
пружина безопасности oauth2 2.0.15
защита весны jwt 1.0.9
Zuul gateway Java конфигурация
@SpringBootApplication
@EnableEurekaClient // It acts as a eureka client
@EnableZuulProxy // Enable Zuul
public class ZuulgatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulgatewayApplication.class, args);
}
}
Конфигурация безопасности
@Configuration
@EnableOAuth2Sso
public class SsoSecurityConfig extends WebSecurityConfigurerAdapter {// OAuth2SsoConfigurerAdapter
// {
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable().cors().disable().logout().and().antMatcher("/**").authorizeRequests()
.antMatchers("/index.html", "/", "/login").permitAll().anyRequest().authenticated().and()
.csrf().disable();
}
}
настройки приложения gist
Eureka micro service
Служба Eureka POM сущность
данные для стартера с весенней загрузкой 2.0.5
стартер с облачным пружиной netflix клиент eureka 2.0.1
веб для весенней загрузки 2.0.5
Spring Cloud Security 1.2.3
Spring Security oauth2 Автоконфигурирование 2.1.1
Конфигурация сервиса Eureka
@SpringBootApplication
@EnableEurekaClient
public class ClusterdemoApplication {
public static void main(String[] args) {
SpringApplication.run(ClusterdemoApplication.class, args);
}
}
Res Конфигурация сервера
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Bean("resourceServerRequestMatcher")
public RequestMatcher resources() {
return new AntPathRequestMatcher("/images/**");
}
@Override
public void configure(final HttpSecurity http) throws Exception {
http
.requestMatcher(resources()).authorizeRequests()
.anyRequest().authenticated();
}
}
API RESTful
@RestController
@RequestMapping("/")
public class HomeController {
@Autowired
private Environment env;
@RequestMapping("/") //use with context-path
// @RequestMapping("/images")
public List<Image> getImages() {
List<Image> images = Arrays.asList(
new Image(1, "Treehouse of Horror V", "https://www.imdb.com/title/tt0096697/mediaviewer/rm3842005760"),
new Image(2, "The Town", "https://www.imdb.com/title/tt0096697/mediaviewer/rm3698134272"),
new Image(3, "The Last Traction Hero", "https://www.imdb.com/title/tt0096697/mediaviewer/rm1445594112"));
return images;
}
}
настройка приложения суть
Eureka server
Eureka server POM gist
spring boot starter web 2.0.5
spring cloud starter netflix eureka server 2.0.1
Eureka serverконфигурация
@SpringBootApplication
@EnableEurekaServer
public class ClusterdemoApplication {
public static void main(String[] args) {
SpringApplication.run(ClusterdemoApplication.class, args);
}
}
приложение yml
spring:
application:
name: eureka-server
server:
port: 8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
Поток тестирования:
1. отправить запрос на шлюз Zuul.GET http://localhost:8762/res/images
2. перенаправлено на экран входа B2C
3. login
ожидаемый результат: отображение json ссылок на изображения
результат теста: перенаправление в микро-сервис http://localhost:8762/login, с помощью CouldОшибка получения маркера доступа
полный образец URL результата
http://localhost:8762/login?state=3kJ31R&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAifQ..5ofS501Kavlbcrtn.c0Wq9m7ZQVwewQD1a_cmnTz4UhvNA50kqGSsF6UOTYhUvMVBv5qsNmHLkqopxQKbNhKImqUDNLqA7t8qgEYIN59juuFCou0kUkDDFmNspSYCLCebhIEeu9EgkCcUH-cqeVom4LjIJyw9QdeHcz8c-89ryLOz1zD9ISS-xGhHHt1DHd8cwtfy-WiVFOaFsvt2L-kSU8iA_cGY4ikT9rf5NdnZ5DSJjvRfNCZnsuKn6dS21McV-M9W1q3Ndyna2Gzf6xldj1SYACb-TxGG-lcOJWnlyf-U2SzZOK_F-r41ZHwxT1cw2iyFHr8qrCaaNRWGJstQ4c2Bs9Vsx0eIi9t_7JXhr4OqfnwAL7vqxlX8pIpaSgAbpQpEa3O7Y0ScNUKXr9HvNpVx9w--ebhkfdjYdBo0QE3RwB3jbKl0u-QGwRqNNUzMO1-DGd_tLhPeX-yLEFMsRSQhQCaeaNT_ZRdmyf63NsGxaOxSEpf3Z0eKJCY0A5knTHmH2A.7BkuNnBwxVL237E6vqMeAw
вывод из консоли отладки zuul gateway
2018-12-06 16:14:18.134 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 1 of 11 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2018-12-06 16:14:18.135 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 2 of 11 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2018-12-06 16:14:18.138 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 3 of 11 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2018-12-06 16:14:18.138 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 4 of 11 in additional filter chain; firing Filter: 'LogoutFilter'
2018-12-06 16:14:18.139 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 5 of 11 in additional filter chain; firing Filter: 'OAuth2ClientAuthenticationProcessingFilter'
2018-12-06 16:14:18.139 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 6 of 11 in additional filter chain; firing Filter: 'RequestCacheAwareFilter'
2018-12-06 16:14:18.139 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 7 of 11 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter'
2018-12-06 16:14:18.140 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 8 of 11 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
2018-12-06 16:14:18.141 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 9 of 11 in additional filter chain; firing Filter: 'SessionManagementFilter'
2018-12-06 16:14:18.142 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 10 of 11 in additional filter chain; firing Filter: 'ExceptionTranslationFilter'
2018-12-06 16:14:18.142 DEBUG 7856 --- [nio-8762-exec-1] o.s.security.web.FilterChainProxy : /res/images at position 11 of 11 in additional filter chain; firing Filter: 'FilterSecurityInterceptor'
2018-12-06 16:14:18.169 DEBUG 7856 --- [nio-8762-exec-2] o.s.security.web.FilterChainProxy : /login at position 1 of 11 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2018-12-06 16:14:18.169 DEBUG 7856 --- [nio-8762-exec-2] o.s.security.web.FilterChainProxy : /login at position 2 of 11 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2018-12-06 16:14:18.169 DEBUG 7856 --- [nio-8762-exec-2] o.s.security.web.FilterChainProxy : /login at position 3 of 11 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2018-12-06 16:14:18.169 DEBUG 7856 --- [nio-8762-exec-2] o.s.security.web.FilterChainProxy : /login at position 4 of 11 in additional filter chain; firing Filter: 'LogoutFilter'
2018-12-06 16:14:18.169 DEBUG 7856 --- [nio-8762-exec-2] o.s.security.web.FilterChainProxy : /login at position 5 of 11 in additional filter chain; firing Filter: 'OAuth2ClientAuthenticationProcessingFilter'
2018-12-06 16:14:26.766 DEBUG 7856 --- [nio-8762-exec-3] o.s.security.web.FilterChainProxy : /login?state=3kJ31R&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAifQ..5ofS501Kavlbcrtn.c0Wq9m7ZQVwewQD1a_cmnTz4UhvNA50kqGSsF6UOTYhUvMVBv5qsNmHLkqopxQKbNhKImqUDNLqA7t8qgEYIN59juuFCou0kUkDDFmNspSYCLCebhIEeu9EgkCcUH-cqeVom4LjIJyw9QdeHcz8c-89ryLOz1zD9ISS-xGhHHt1DHd8cwtfy-WiVFOaFsvt2L-kSU8iA_cGY4ikT9rf5NdnZ5DSJjvRfNCZnsuKn6dS21McV-M9W1q3Ndyna2Gzf6xldj1SYACb-TxGG-lcOJWnlyf-U2SzZOK_F-r41ZHwxT1cw2iyFHr8qrCaaNRWGJstQ4c2Bs9Vsx0eIi9t_7JXhr4OqfnwAL7vqxlX8pIpaSgAbpQpEa3O7Y0ScNUKXr9HvNpVx9w--ebhkfdjYdBo0QE3RwB3jbKl0u-QGwRqNNUzMO1-DGd_tLhPeX-yLEFMsRSQhQCaeaNT_ZRdmyf63NsGxaOxSEpf3Z0eKJCY0A5knTHmH2A.7BkuNnBwxVL237E6vqMeAw at position 1 of 11 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2018-12-06 16:14:26.767 DEBUG 7856 --- [nio-8762-exec-3] o.s.security.web.FilterChainProxy : /login?state=3kJ31R&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAifQ..5ofS501Kavlbcrtn.c0Wq9m7ZQVwewQD1a_cmnTz4UhvNA50kqGSsF6UOTYhUvMVBv5qsNmHLkqopxQKbNhKImqUDNLqA7t8qgEYIN59juuFCou0kUkDDFmNspSYCLCebhIEeu9EgkCcUH-cqeVom4LjIJyw9QdeHcz8c-89ryLOz1zD9ISS-xGhHHt1DHd8cwtfy-WiVFOaFsvt2L-kSU8iA_cGY4ikT9rf5NdnZ5DSJjvRfNCZnsuKn6dS21McV-M9W1q3Ndyna2Gzf6xldj1SYACb-TxGG-lcOJWnlyf-U2SzZOK_F-r41ZHwxT1cw2iyFHr8qrCaaNRWGJstQ4c2Bs9Vsx0eIi9t_7JXhr4OqfnwAL7vqxlX8pIpaSgAbpQpEa3O7Y0ScNUKXr9HvNpVx9w--ebhkfdjYdBo0QE3RwB3jbKl0u-QGwRqNNUzMO1-DGd_tLhPeX-yLEFMsRSQhQCaeaNT_ZRdmyf63NsGxaOxSEpf3Z0eKJCY0A5knTHmH2A.7BkuNnBwxVL237E6vqMeAw at position 2 of 11 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2018-12-06 16:14:26.767 DEBUG 7856 --- [nio-8762-exec-3] o.s.security.web.FilterChainProxy : /login?state=3kJ31R&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAifQ..5ofS501Kavlbcrtn.c0Wq9m7ZQVwewQD1a_cmnTz4UhvNA50kqGSsF6UOTYhUvMVBv5qsNmHLkqopxQKbNhKImqUDNLqA7t8qgEYIN59juuFCou0kUkDDFmNspSYCLCebhIEeu9EgkCcUH-cqeVom4LjIJyw9QdeHcz8c-89ryLOz1zD9ISS-xGhHHt1DHd8cwtfy-WiVFOaFsvt2L-kSU8iA_cGY4ikT9rf5NdnZ5DSJjvRfNCZnsuKn6dS21McV-M9W1q3Ndyna2Gzf6xldj1SYACb-TxGG-lcOJWnlyf-U2SzZOK_F-r41ZHwxT1cw2iyFHr8qrCaaNRWGJstQ4c2Bs9Vsx0eIi9t_7JXhr4OqfnwAL7vqxlX8pIpaSgAbpQpEa3O7Y0ScNUKXr9HvNpVx9w--ebhkfdjYdBo0QE3RwB3jbKl0u-QGwRqNNUzMO1-DGd_tLhPeX-yLEFMsRSQhQCaeaNT_ZRdmyf63NsGxaOxSEpf3Z0eKJCY0A5knTHmH2A.7BkuNnBwxVL237E6vqMeAw at position 3 of 11 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2018-12-06 16:14:26.767 DEBUG 7856 --- [nio-8762-exec-3] o.s.security.web.FilterChainProxy : /login?state=3kJ31R&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAifQ..5ofS501Kavlbcrtn.c0Wq9m7ZQVwewQD1a_cmnTz4UhvNA50kqGSsF6UOTYhUvMVBv5qsNmHLkqopxQKbNhKImqUDNLqA7t8qgEYIN59juuFCou0kUkDDFmNspSYCLCebhIEeu9EgkCcUH-cqeVom4LjIJyw9QdeHcz8c-89ryLOz1zD9ISS-xGhHHt1DHd8cwtfy-WiVFOaFsvt2L-kSU8iA_cGY4ikT9rf5NdnZ5DSJjvRfNCZnsuKn6dS21McV-M9W1q3Ndyna2Gzf6xldj1SYACb-TxGG-lcOJWnlyf-U2SzZOK_F-r41ZHwxT1cw2iyFHr8qrCaaNRWGJstQ4c2Bs9Vsx0eIi9t_7JXhr4OqfnwAL7vqxlX8pIpaSgAbpQpEa3O7Y0ScNUKXr9HvNpVx9w--ebhkfdjYdBo0QE3RwB3jbKl0u-QGwRqNNUzMO1-DGd_tLhPeX-yLEFMsRSQhQCaeaNT_ZRdmyf63NsGxaOxSEpf3Z0eKJCY0A5knTHmH2A.7BkuNnBwxVL237E6vqMeAw at position 4 of 11 in additional filter chain; firing Filter: 'LogoutFilter'
2018-12-06 16:14:26.767 DEBUG 7856 --- [nio-8762-exec-3] o.s.security.web.FilterChainProxy : /login?state=3kJ31R&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAifQ..5ofS501Kavlbcrtn.c0Wq9m7ZQVwewQD1a_cmnTz4UhvNA50kqGSsF6UOTYhUvMVBv5qsNmHLkqopxQKbNhKImqUDNLqA7t8qgEYIN59juuFCou0kUkDDFmNspSYCLCebhIEeu9EgkCcUH-cqeVom4LjIJyw9QdeHcz8c-89ryLOz1zD9ISS-xGhHHt1DHd8cwtfy-WiVFOaFsvt2L-kSU8iA_cGY4ikT9rf5NdnZ5DSJjvRfNCZnsuKn6dS21McV-M9W1q3Ndyna2Gzf6xldj1SYACb-TxGG-lcOJWnlyf-U2SzZOK_F-r41ZHwxT1cw2iyFHr8qrCaaNRWGJstQ4c2Bs9Vsx0eIi9t_7JXhr4OqfnwAL7vqxlX8pIpaSgAbpQpEa3O7Y0ScNUKXr9HvNpVx9w--ebhkfdjYdBo0QE3RwB3jbKl0u-QGwRqNNUzMO1-DGd_tLhPeX-yLEFMsRSQhQCaeaNT_ZRdmyf63NsGxaOxSEpf3Z0eKJCY0A5knTHmH2A.7BkuNnBwxVL237E6vqMeAw at position 5 of 11 in additional filter chain; firing Filter: 'OAuth2ClientAuthenticationProcessingFilter'
На консоли отладки микроуслуг ничего не отображается.
Я предполагаю, что шлюз Zuul неправильно обрабатывал токен.Поэтому токен доступа не ретранслируется на фактически ресурсный сервер.Это микро сервис.
Как мне это исправить?что я пропускаю?
Я уже пробовал context-path, та же ошибка stackoverflow ссылка
Обновление 1:
Я нахожумой .yml кажется неправильнымЕсли я хочу использовать JWK.Я должен установить предпочитаемый-токен-информация в true.После того как я изменил это.У него класс не найден, исключение
java.lang.ClassNotFoundException: org.springframework.security.oauth2.provider.token.TokenStore
, но я могу найти класс в spring-security-oauth2, у 2.0.12 и 2.3.4 он есть.
Обновление 2:
Попробовав множество комбинаций весенней загрузки и весеннего облака.Наиболее близким из них является Spring boot 1.5.16.RELEASE + spring cloud Edgware.SR5.Но эта комбинация дает мне java.lang.ClassNotFoundException: org.springframework.security.oauth2.provider.token.RemoteTokenServices
Если я попытаюсь это исправить, принудительно установив версию spring-security-oauth2 в 2.0.15.RELEASE.Это дает
java.lang.ClassNotFoundException: org.springframework.boot.context.properties.bind.Bindable
Мне наконец удалось запустить его, не зная причины.эффективный POM эффективный POM
Но тогда я решаю использовать SCG, пружину 2.0.5 и Finchley.SR1.Так, чтобы это больше соответствовало серверу ресурсов.
конфигурация весеннего облачного шлюза:
spring.cloud.gateway:
routes:
- id: test
uri: lb://image-service
predicates:
- Path=/res/images/**
Окончательный результат заключается в том, что шлюз использует client_id, client_secret с кодом авторизации.Отправьте запрос конечной точке Azure B2C / token, чтобы попытаться получить токен доступа.И получил null
java.lang.IllegalStateException: Access token provider returned a null access token, which is illegal according to the contract.
at org.springframework.security.oauth2.client.OAuth2RestTemplate.acquireAccessToken(OAuth2RestTemplate.java:223) ~[spring-security-oauth2-2.1.0.RELEASE.jar:na]
Access token provider returned a null access token, which is illegal according to the contract.
полный журнал ошибок
также немного изменил B2C yml
security:
basic:
enabled: false
oauth2:
sso:
loginPath: /login
client:
clientId: 111ddde5-38af-4c31-a540-f204d64ccc5e
clientSecret: [protected]
access-token-uri: https://login.microsoftonline.com/te/umediax.onmicrosoft.com/b2c_1_signinup/oauth2/v2.0/token
user-authorization-uri: https://login.microsoftonline.com/te/umediax.onmicrosoft.com/b2c_1_signinup/oauth2/v2.0/authorize
scope: openid
auto-approve-scopes: true
authorizedGrantTypes: authorization_code
clientAuthenticationScheme: form
resource:
jwk:
key-set-uri: https://login.microsoftonline.com/te/umediax.onmicrosoft.com/b2c_1_signinup/discovery/v2.0/keys
prefer-token-info: true
Как мне отладить это?