JHipster: вызовы службы отдыха возвращают «401 Unauthorized» при маршрутизации через шлюз - PullRequest
3 голосов
/ 27 февраля 2020

Я новичок в микросервисах и JHipster, поэтому, пожалуйста, наберитесь терпения и помогите мне в случае необходимости

У меня есть проблема с конфигурацией, но я не могу ее найти. Вот некоторые подробности:

Мы используем шлюз JHipster с Keycloak. Среда Docker compose, и, насколько я могу судить, мы выполнили необходимую работу, как указано в документации JHipster для docker.

Мы используем oauth2 в качестве типа аутентификации.

Развернутый ресурс только для отдыха. Простейший случай с двумя вызовами: / api / hello -> должен возвращать «Я говорю Hello» / free / hello -> должен возвращать «Я свободен!»

Вызов / api / hello должен быть защищен и / free / hello call явно нет.

Когда я подключаюсь к сервису / free / hello через шлюз, т.е. http://gatewayip: порт / helloapp / free / hello , я получаю ожидаемый ответ «Я свободен!»

Так что я ожидаю, что шлюз запущен и работает и маршрутизирует трафик c.

Для защищенного сервиса я использую почтальон, чтобы сначала получить токен JWT.
Когда я обращаюсь к сервису напрямую, т.е. serverip: appPort / api / hello, я получаю ожидаемый ответ

Для меня это означает, что сервис работает, и Spring Security может использовать мой токен JWT.

Теперь проблема начинается, когда я пытаюсь направить к защищенному сервису через шлюз. Я использую тот же токен через почтальона. http://gatewayip: порт / helloapp / api / hello

Теперь я получаю ответ: введите "https://www.jhipster.tech/problem/problem-with-message" title Статус "Не авторизован" 401 подробно "Полная аутентификация требуется для доступа к этому ресурсу" путь "/ api / hello" сообщение "error.http.401"

Есть ли где-нибудь FAQ или контрольный список, к которому я могу обратиться, чтобы попробовать и устранить неполадки?

Пожалуйста, дайте мне знать, какую информацию я могу добавить, чтобы помочь.

Редактировать:

SecurityConfiguration:

@EnableWebSecurity
@Import(SecurityProblemSupport.class)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Value("${spring.security.oauth2.client.provider.oidc.issuer-uri}")
private String issuerUri;

private final JHipsterProperties jHipsterProperties;
private final JwtAuthorityExtractor jwtAuthorityExtractor;
private final SecurityProblemSupport problemSupport;

public SecurityConfiguration(JwtAuthorityExtractor jwtAuthorityExtractor, JHipsterProperties jHipsterProperties, SecurityProblemSupport problemSupport) {
    this.problemSupport = problemSupport;
    this.jwtAuthorityExtractor = jwtAuthorityExtractor;
    this.jHipsterProperties = jHipsterProperties;
}

@Override
public void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
        .csrf()
        .disable()
        .exceptionHandling()
            .authenticationEntryPoint(problemSupport)
            .accessDeniedHandler(problemSupport)
    .and()
        .headers()
        .contentSecurityPolicy("default-src 'self'; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:")
    .and()
        .referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN)
    .and()
        .featurePolicy("geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'")
    .and()
        .frameOptions()
        .deny()
    .and()
        .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    .and()
        .authorizeRequests()
        .antMatchers("/api/auth-info").permitAll()
        .antMatchers("/api/**").authenticated()//hasAuthority(AuthoritiesConstants.USER)//permitAll()
        .antMatchers("/management/health").permitAll()
        .antMatchers("/management/info").permitAll()
        .antMatchers("/management/prometheus").permitAll()
        .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN)
    .and()
        .oauth2ResourceServer()
            .jwt()
            .jwtAuthenticationConverter(jwtAuthorityExtractor)
            .and()
        .and()
            .oauth2Client();
    // @formatter:on
}

Редактировать 2: Application.yml

security:
oauth2:
    client:
        access-token-uri: http://xxx.xxx.xxx.xxx:30080/auth/realms/test/protocol/openid-connect/token
        user-authorization-uri: http://xxx.xxx.xxx.xxx:30080/auth/realms/test/protocol/openid-connect/auth
        client-id: web_app
        client-secret: web_app
        scope: openid profile email

    resource:
        user-info-uri: http://xxx.xxx.xxx.xxx:30080/auth/realms/test/protocol/openid-connect/userinfo         

server:
 port: 40404

Редактировать 3: Этот вопрос похож на мой:

JHipster - Как добавить маршрут к внешним микросервисам в application.yml

Не было дано никаких ответов, и решение, к которому пришел плакат, состояло в том, чтобы просто разрешить All () на путь / api / **. Это не очень хороший вариант, поскольку он оставляет конечную точку незащищенной.

Еще один похожий вопрос здесь:

Jhipster OAuth 2.0 / OID C Заголовок авторизации аутентификации с токеном носителя

Получено несколько ответов на использование @EnableResourceServer. Это старый пост, и у меня сложилось впечатление, что новая версия приложения Jhipster, в которой я работаю, отлично подходит для этого сценария - я ошибаюсь, заявив об этом?

1 Ответ

0 голосов
/ 11 марта 2020

После включения входа в SpringSecurity добавлением

@Override
    public void configure(WebSecurity web){
        web.debug(true);
    }

в классе SecurityConfiguration. java мы могли видеть, что заголовки безопасности не были переадресованы шлюзом.

Это привело нам на эту страницу: https://github.com/spring-cloud/spring-cloud-netflix/issues/3126

Это объясняет почему.

Когда кто-то изменяет параметры zuul в конфигурации (gateway.yml / jhipster-registry.yml) :

    zuul: # those values must be configured depending on the application specific needs
    .
    .
        ignore-security-headers: false
        ignored-headers: cookie,set-cookie
        sensitiveHeaders: Cookie,Set-Cookie
    .

Имейте в виду, что конфигурация по умолчанию исключает пересылку конфиденциальных заголовков по соображениям безопасности, поэтому убедитесь, что вы понимаете, что делаете, если измените это.

...