calling blocking feign client from reactive spring service

780 views Asked by At

I am trying to call generated feign client from reactive spring flux like this:

            .doOnNext(user1 -> {
            ResponseEntity<Void> response = recorderClient.createUserProfile(new UserProfileDto().principal(user1.getLogin()));
            if (!response.getStatusCode().equals(HttpStatus.OK)) {
                log.error("recorder backend could not create user profile for user: {} ", user1.getLogin());
                throw new RuntimeException("recorder backend could not create user profile for login name" + user1.getLogin());
            }
        })

Call is executed, but when I try to retrieve jwt token from reactive security context ( in a requets interceptor ) like this:

    public static Mono<String> getCurrentUserJWT() {
    return ReactiveSecurityContextHolder
        .getContext()
        .map(SecurityContext::getAuthentication)
        .filter(authentication -> authentication.getCredentials() instanceof String)
        .map(authentication -> (String) authentication.getCredentials());
}

....

SecurityUtils.getCurrentUserJWT().blockOptional().ifPresent(s -> template.header(AUTHORIZATION_HEADER, String.format("%s %s", BEARER, s)));

context is empty. As I am pretty new to reactive spring I am surely mussing something stupid and important.

1

There are 1 answers

0
Reza Elborneo On

Not sure how is your interceptor configured, but in my case, i just simply implement ReactiveHttpRequestInterceptor and override apply() function

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import reactivefeign.client.ReactiveHttpRequest;
import reactivefeign.client.ReactiveHttpRequestInterceptor;
import reactor.core.publisher.Mono;

import java.util.Collections;

@Component
public class UserFeignClientInterceptor implements ReactiveHttpRequestInterceptor {

    private static final String AUTHORIZATION_HEADER = "Authorization";
    private static final String BEARER = "Bearer";

    @Override
    public Mono<ReactiveHttpRequest> apply(ReactiveHttpRequest reactiveHttpRequest) {
        return SecurityUtils.getCurrentUserJWT()
            .flatMap(s -> {
                reactiveHttpRequest.headers().put(AUTHORIZATION_HEADER, Collections.singletonList(String.format("%s %s", BEARER, s)));
                return Mono.just(reactiveHttpRequest);
            });
    }
}