Имитация динамических значений перехватчика запросов

Я являюсь клиентом некоторых API-интерфейсов, которым мне нужно отправлять токен в каждом запросе, и чтобы получить этот токен, мне нужно получить доступ к /auth/token отправке имени пользователя и пароля, и я подумал об использовании перехватчика запросов для его решения. Но имя пользователя и пароль для каждого запроса различаются, есть способ использовать динамические значения в имитирующем перехватчике запросов или перед каждым вызовом API, который мне нужно будет вызывать /auth/token с помощью обычного имитационного клиента?

У меня есть Service, который обращается к этому API токенов

@Service
@RequiredArgsConstructor
public class AuthService {
  private final AuthClient client;
  private final AuthProperties properties;

  @Cacheable("tokens")
  public AuthToken getToken(AuthUser user) {
      return client.authenticate(properties.getClientId(), properties.getSecret(), user.getUser(),
            user.getPassword());
  }
}

Поддельный клиент для доступа к API токенов

public interface AuthClient {
  @RequestLine("GET /token?client_id={client_id}&client_secret={client_secret}&grant_type=password&username={username}&password={password}")
  AuthToken authenticate(@Param("client_id") String client_id, @Param("client_secret") String client_secret,
                            @Param("username") String username, @Param("password") String password);
}

И RequestInterceptor, который использует эту услугу

@RequiredArgsConstructor
public class AuthRequestInterceptor implements RequestInterceptor {

  private final AuthUser user;
  @Autowired
  private final AuthService authService;

  @Override
  public void apply(RequestTemplate template) {
    AuthToken token = authService.getToken(user);
    template.header("Authorization", "Bearer " + token.getAccess_token());
  }
}

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


person ghn1712    schedule 31.10.2018    source источник
comment
Да, это возможно. Не могли бы вы показать, что вы уже сделали?   -  person Thiru    schedule 31.10.2018
comment
Привет, я в похожей ситуации. Как вы получите пользователя в приватном конечном пользователе AuthUser   -  person Akhil    schedule 11.01.2021
comment
Насколько я помню, из-за того, что на запрос были разные пользователи, мы не использовали перехватчик запросов.   -  person ghn1712    schedule 13.01.2021


Ответы (2)


При использовании Spring вам нужно будет зарегистрировать RequestInterceptor как @Bean, чтобы он применялся автоматически. Если вы не используете Spring или вручную создаете Feign Clients, зарегистрируйте перехватчик, используя метод Feign.builder.interceptor().

person Kevin Davis    schedule 20.05.2019

Добавьте перехватывающий bean-компонент в свой класс Feign @Configuration:

@Bean
public RequestInterceptor myInterceptor() {
  return template -> {
    // For example, add a header to an intercepted query:
    template.header(
      MY_HEADER_NAME,
      MY_HEADER_VALUE);
  };
}
person Zon    schedule 22.07.2021