Client side authentication with jax-rs and cxf
We are going to switch the JAX-RS implementation from Jersey to Apache CXF 3.0. I just can't figure out how Apache CXF Basic Authentication is done. All examples I found are somewhere around CXF WebClient
and not JAX-RS client API.
This is what works with Jersey:
Client client = ClientBuilder.newClient();
client.register(HttpAuthenticationFeature.basic(config.getUsername(),config.getPassword()));
How do I do this with Apache CXF?
source to share
Create ClientRequestFilter
to perform basic authentication:
@Provider
public class Authenticator implements ClientRequestFilter {
private String user;
private String password;
public Authenticator(String user, String password) {
this.user = user;
this.password = password;
}
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
requestContext.getHeaders().add(
HttpHeaders.AUTHORIZATION, getBasicAuthentication());
}
private String getBasicAuthentication() {
String userAndPassword = this.user + ":" + this.password;
byte[] userAndPasswordBytes = userAndPassword.getBytes("UTF-8");
return "Basic " + Base64.getEncoder().encodeToString(userAndPasswordBytes);
}
}
And register it in Client
:
Client client = ClientBuilder.newClient().register(new Authenticator(user, password));
The solution above uses Java 8 to perform Base64 encoding Base64.Encoder
.
If for some reason you are not using Java 8, you can use BaseEncoding
from Google Guava .
source to share