Код: Выделить всё
public class OAuth1Processor implements Processor {
private static final String CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final SecureRandom RANDOM = new SecureRandom();
@Override
public void process(Exchange exchange) throws Exception {
IntegrationInterface integrationInterface = exchange.getProperty("integrationInterface", IntegrationInterface.class);
String consumerKey = "customer_key";
String consumerSecret = "customer_secret";
String accessToken = "access_token";
String tokenSecret = "token_secret";
String signatureMethod = "HMAC-SHA256";
String realm = "realm";
String httpMethod = "POST";
String url = "https://url-example.com";
Map oauthParams = new TreeMap();
oauthParams.put("oauth_consumer_key", consumerKey);
oauthParams.put("oauth_token", accessToken);
oauthParams.put("oauth_signature_method", signatureMethod);
oauthParams.put("oauth_timestamp", String.valueOf(System.currentTimeMillis() / 1000));
oauthParams.put("oauth_nonce", generateNonce(11));
oauthParams.put("oauth_version", "1.0");
String baseSignatureString = generateSignatureBaseString(httpMethod, url, oauthParams);
String rawSignature = generateRawSignature(baseSignatureString, consumerSecret, tokenSecret);
String encodedSignature = encode(rawSignature);
oauthParams .put("oauth_signature", encodedSignature);
oauthParams.put("realm", realm);
String authHeader = buildAuthorizationHeader(oauthParams);
exchange.getIn().getHeaders().clear();
exchange.getIn().setHeader("Authorization", authHeader);
}
private String buildAuthorizationHeader(Map oauthParams) {
StringBuilder header = new StringBuilder("OAuth ");
for (Map.Entry entry : oauthParams.entrySet()) {
String key = entry.getKey();
String value = key.equals("oauth_signature") ? entry.getValue() : encode(entry.getValue());
header.append(encode(key)).append("=\"").append(value).append("\",");
}
header.setLength(header.length() - 1);
return header.toString();
}
public static String generateNonce(int length) {
StringBuilder newNonce = new StringBuilder();
for (int i = 0; i < length; i++) {
newNonce.append(CHARSET.charAt(RANDOM.nextInt(CHARSET.length())));
}
return newNonce.toString();
}
private static String encode(String value) {
return URLEncoder
.encode(value, StandardCharsets.UTF_8)
.replace("+", "%20")
.replace("*", "%2A")
.replace("%7E", "~");
}
private String generateRawSignature(String baseSignature, String consumerSecret, String tokenSecret) throws Exception {
String secret = encode(consumerSecret) + "&" + encode(tokenSecret);
byte[] keyBytes = secret.getBytes(StandardCharsets.UTF_8);
SecretKey key = new SecretKeySpec(keyBytes, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(key);
byte[] signatureBytes = mac.doFinal(baseSignature.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(signatureBytes);
}
private String generateSignatureBaseString(String httpMethod, String url, Map requestParams) {
Map sortedParams = requestParams.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldVal, newVal) -> oldVal,
LinkedHashMap::new
));
StringBuilder base = new StringBuilder();
sortedParams.forEach((key, value) -> {
base.append(encode(key)).append("=").append(encode(value)).append("&");
});
base.setLength(base.length() - 1);
return httpMethod.toUpperCase() + "&" + encode(url) + "&" + encode(base.toString());
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... redentials