Spring安全性WebFlux“在请求中找到多个承载令牌”

时间:2019-07-05 17:09:57

标签: spring spring-security keycloak openid-connect spring-webflux

我正在创建一个有角度的应用程序(聊天),该应用程序通过angular-oauth2-oidc连接到Keycloak,并调用后端spring boot WebFlux作为SecurityRessourceServer来获取和发布消息。当用户进入应用程序时,将调用服务以获取一些历史消息,并调用sse服务。 使用第一个GET,我没有任何问题。承载令牌可以很好地在标头“ Authorisation”中发送,并且可以正常工作。但是对于上证所(带有经典事件源)。令牌不能作为标头而是作为路径变量(OAuth建议使用access_token)进行传递,但是spring security无法捕获它并返回401。

要解决此问题,我添加了一个过滤器,该过滤器捕获uri中的令牌并将其作为标头注入。令人惊讶的是,现在的春季靴子用以下消息响应500:在请求中找到多个承载令牌。

我试图将路径变量名称更改为“ tok”,现在可以正常使用了。因此,我理解,比起spring,Spring可以很好地捕获URL中名称为access_token的令牌,但不是很好。可能是配置错误吗?

带有过滤器的Spring安全配置:

@Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http
                .csrf().disable()
                .addFilterAt((WebFilter) (exchange, chain) -> {
                    ServerHttpRequest request = exchange.getRequest();
                    if(HttpMethod.GET.equals(request.getMethod()) && request.getQueryParams().getFirst("access_token")!=null) {
                        exchange.getRequest().mutate().headers(httpHeaders ->
                                httpHeaders.add(
                                    "Authorization",
                                    request.getQueryParams().getFirst("access_token"))
                        );
                    }
                    return chain.filter(exchange);
                }, SecurityWebFiltersOrder.FIRST)
                .authorizeExchange()
                .pathMatchers(HttpMethod.OPTIONS ,"/**").permitAll()
                .anyExchange().authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt();
        return http.build();
    }

和EventSource调用:

const accessToken = 'Bearer ' + this.oauthService.getAccessToken();
    const eventSource = new EventSource(
      this.baseUrl + '/messages/subscribe?travelId=cb223637-9290-43e3-a096-2226fab67ee0&access_token=' + accessToken
    );

您有个主意吗? 预先感谢。

0 个答案:

没有答案