Настройте Spring Security 5 Oauth 2 для использования параметра uri access_token - PullRequest
0 голосов
/ 27 сентября 2018

Я создаю приложение на основе этого примера -

Фон -

https://github.com/spring-projects/spring-security/tree/master/samples/boot/oauth2resourceserver-webflux

Отлично работает с маркером OAuth2находится в заголовке.

Проблема -

Однако я хотел бы изменить его на использование токена OAuth 2 в URL.Я пытаюсь создать сервер ресурсов OAuth2.

Анализ-

Похоже, Spring Security поддерживает получение токена из параметра access_token -

https://github.com/spring-projects/spring-security/blob/e3eaa99ad06769cf44ad3e1249f6398077b90834/oauth2/oauth2-resource-server/src/main/java/org/springframework/security/oauth2/server/resource/web/server/ServerBearerTokenAuthenticationConverter.java#L57

Однако, по-видимому, он по умолчанию отключен -

https://github.com/spring-projects/spring-security/blob/master/oauth2/oauth2-resource-server/src/main/java/org/springframework/security/oauth2/server/resource/web/server/ServerBearerTokenAuthenticationConverter.java#L48

Теперь этот класс недоступен за пределами непосредственно созданной иерархии пружин -

https://github.com/spring-projects/spring-security/blob/master/config/src/main/java/org/springframework/security/config/web/server/ServerHttpSecurity.java#L955

Вопрос?

Можно ли установить для этого allowUriQueryParameter значение true в моем коде?

Обновление

Я создаю сервер ресурсов OAuth2.К сожалению, OAuth2ResourceServerSpec не позволяет установить authenticationConverter.

Ответы [ 4 ]

0 голосов
/ 08 июля 2019

Теперь с помощью Spring Security 5.1.5 мы можем сделать это -

ServerBearerTokenAuthenticationConverter 
authenticationConverter = new ServerBearerTokenAuthenticationConverter();
authenticationConverter.setAllowUriQueryParameter(true);

http.oauth2ResourceServer().bearerTokenConverter(authenticationConverter).jwt();
0 голосов
/ 04 октября 2018

В качестве обходного пути вы можете написать WebFilter для преобразования параметра запроса в заголовок.

0 голосов
/ 22 марта 2019

Spring MVC имеет много разумных значений по умолчанию, которых нет в WebFlux.Это один из них.

Я решил эту проблему, настроив WebFilter, который принимает токены в строке запроса и добавляет их в заголовок.

@Override
@NonNull
public Mono<Void> filter(
  @NonNull ServerWebExchange serverWebExchange, @NonNull WebFilterChain 
     webFilterChain) {
  ServerHttpRequest request = serverWebExchange.getRequest();
  return webFilterChain.filter(
    serverWebExchange.mutate().request(sanitizeRequest(request)).build());
}

private ServerHttpRequest sanitizeRequest(ServerHttpRequest request) {
  MultiValueMap<String, String> queryParams = request.getQueryParams();
  ServerHttpRequest.Builder newRequest =
    request
        .mutate()
        .headers(
            headers -> {
              if (headerContainsAuthorizationKey(headers)) {
                String token = getAuthorizationBearer(headers);
                if (token != null) {
                  // "bearer" breaks WebFlux OAuth :)
                  headers.set(HttpHeaders.AUTHORIZATION, token.replace("bearer", "Bearer"));
                  return;
                }
              }
              if (pathContainsAccessToken(queryParams)) {
                headers.set(
                    HttpHeaders.AUTHORIZATION,
                    "Bearer " + queryParams.getFirst("access_token"));
              }
            });

  if (pathContainsAccessToken(queryParams)) {
    newRequest.uri(buildNewUriWithoutToken(request.getURI(), queryParams));
  }
  return newRequest.build();
 }
}

Приятно отметить, чтострочный «переносчик» также нарушает работу WebFlux.

После этого вы можете добавить этот фильтр прямо перед вашей спецификацией oauthResourceServer в цепочке безопасности:

@Bean
public SecurityWebFilterChain springSecurityFilterChain(
  ServerHttpSecurity http,
  TokenStore tokenStore,
  AuthorizationHeaderFilter authorizationHeaderFilter) {
    http.csrf()
      .disable()
      .authorizeExchange()
      .anyExchange()
      .authenticated()
      .and()
      .addFilterAt(authorizationHeaderFilter, SecurityWebFiltersOrder.FIRST)
      .oauth2ResourceServer()
      .jwt() // ...  etc
  return http.build();
}
0 голосов
/ 27 сентября 2018

Вы можете проверить официальные документы для Spring Security

Вы можете создать new ServerBearerTokenAuthenticationConverter(), установить allowUriQueryParameter регистр в ServerHttpSecurity.

@Bean
SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http
        // ...
        .oauth2Login()
            .authenticationConverter(converter) // set 
            .authenticationManager(manager)
            .authorizedClientRepository(authorizedClients)
            .clientRegistrationRepository(clientRegistrations);
    return http.build();
}
...