伪装请求拦截器动态值

时间:2018-10-31 14:19:48

标签: java feign

我是某些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());
  }
}

我不确定在构建伪装客户端以根据请求设置用户时如何添加此拦截器

2 个答案:

答案 0 :(得分:1)

使用Spring时,您需要将RequestInterceptor注册为@Bean才能自动应用它。如果您不使用Spring或手动构建Feign Client,请使用Feign.builder.interceptor()方法注册拦截器。

答案 1 :(得分:0)

在你的 Feign @Configuration 类中添加一个拦截 bean:

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