Apache Camel Processor - OAuth 1.0 возвращает 401, несмотря на правильные учетные данныеJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Apache Camel Processor - OAuth 1.0 возвращает 401, несмотря на правильные учетные данные

Сообщение Anonymous »

Я работаю над классом процессора в Apache Camel (Java) для аутентификации с внешней системой с использованием OAuth 1.0. Основная проблема заключается в том, что система назначения возвращает 401 несанкционированную ошибку. Поэтому я подозреваю, что проблема связана с OAuth_Signature, но я не смог определить проблему. Я делюсь своим кодом ниже, если кто -то сможет заметить, что может быть не так.

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»