Spring Cloud Zuul за Azure B2C, не удалось получить токен доступа - PullRequest
0 голосов
/ 06 декабря 2018

Я работаю над этим уже несколько месяцев.Я думаю, что я действительно близко.Моя цель: использовать шлюз 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

Как мне отладить это?

...