Not sure. I think RestTemplate + oauth HttpFactory decoration is not suitable for it at all. I thought about it and ended up by writing own MessageConverter for that.
Does anybody from this project tell me his thoughts about it?
Here is my code (mainly copy-pasted from OAuthClientHttpRequestFactory):
Code:
public class OAuthPostMessageConverter extends FormHttpMessageConverter {
private ProtectedResourceDetails resource;
private OAuthConsumerSupport support = new CoreOAuthConsumerSupport();;
@Override
public void write(MultiValueMap<String, ? > map, MediaType contentType,
HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
OAuthSecurityContext context = OAuthSecurityContextHolder.getContext();
ClientHttpRequest req = (ClientHttpRequest) outputMessage;
if (context == null) {
throw new IllegalStateException("No OAuth security context has been established. Unable to access resource '" + this.resource.getId() + "'.");
}
Map<String, OAuthConsumerToken> accessTokens = context.getAccessTokens();
OAuthConsumerToken accessToken = accessTokens == null ? null : accessTokens.get(this.resource.getId());
if (accessToken == null) {
throw new AccessTokenRequiredException("No OAuth security context has been established. Unable to access resource '" + this.resource.getId() + "'.", resource);
}
Map<String, String> params = new HashMap<String, String>();
for (Map.Entry<String, ?> entry : map.entrySet()) {
@SuppressWarnings("unchecked")
List<String> value= (List<String>) entry.getValue();
params.put(entry.getKey(), value.get(0));
}
String authHeader = this.support.getAuthorizationHeader(this.resource, accessToken, req.getURI().toURL(), req.getMethod().name(), params);
req.getHeaders().add("Authorization", authHeader);
super.write(map, contentType, outputMessage);
}
public void setResource(ProtectedResourceDetails resource) {
this.resource = resource;
}
public void setSupport(OAuthConsumerSupport support) {
this.support = support;
}
}