我正在创建一个有角度的应用程序(聊天),该应用程序通过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
);
您有个主意吗? 预先感谢。