Построение подписи Gigya на Android Base64 проблемы кодирования
Привет, у меня проблемы с созданием подписи Gygia. Я попробовал все в этом посте, и я почти уверен, что моя проблема находится в которой я использую Base64. Вот что я получил прямо сейчас.
Оба метода дают мне неправильные ключи
static String sign(String timestamp, String uid, String key) {
String baseString = timestamp + "_" + uid;
String lRet = "";
byte[] baseBytes;
try {
baseBytes = baseString.getBytes("UTF-8");
byte[] secretKeyBytes = org.apache.commons.codec.binary.Base64
.decodeBase64(key.getBytes());
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(secretKeyBytes, "HmacSHA1"));
byte[] signatureBytes = mac.doFinal(baseBytes);
byte[] encodedSign = org.apache.commons.codec.binary.Base64
.encodeBase64(signatureBytes);
lRet = new String(encodedSign, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return lRet;
}
Я попробовал другую реализацию, но моя подпись включает такие символы, как "/" и "+", и Гигья отбрасывает ее назад.
private String constructSignature(String timestamp, String UID, String pKey) {
// Construct a "base string" for signing
String baseString = timestamp + "_" + UID;
// Convert the base string into a binary array
byte[] binaryBaseString = ConvertUTF8ToBytes(baseString);
// Convert secretKey from BASE64 to a binary array
byte[] binaryKey = ConvertFromBase64ToBytes(pKey);
// Use the HMAC-SHA1 algorithm to calculate the signature
byte[] binarySignature = hmacsha1(baseString, binaryKey);
// Convert the signature to a BASE64
String signature = ConvertToBase64(binarySignature);
return signature;
}
private byte[] ConvertUTF8ToBytes(String pString) {
try {
return pString.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
private byte[] ConvertFromBase64ToBytes(String pBase64String) {
return android.util.Base64.decode(pBase64String,
android.util.Base64.DEFAULT);
}
private String ConvertToBase64(byte[] data) {
String retString = android.util.Base64.encodeToString(data, android.util.Base64.DEFAULT);
return retString;
}
Я немного перебрал этот код, я использовал commons.codec Base64, а также версию Gigya, но не повезло. Любые указатели будут высоко оценены. С уважением
Ошибка, которую я получаю от Gigya с плохим ключом:
errorCode:400006
errorMessage:Invalid parameter value
errorDetails:Invalid argument: invalid signature
data:{"statusCode":400,"errorMessage":"Invalid parameter
value","errorCode":400006,"callId":"0106c32c05e14afba1fc93ae0659bb69",
"errorDetails":"Invalid argument: invalid signature","statusReason":"Bad Request"}
1 ответ
Хорошо прочитав пост, о котором я упоминал, я нашел в принятом ответе класс SigUtils, который в основном делает всю работу за вас... занял у меня какое-то время, и я надеюсь, что я не потратил никого времени. Вот как сгенерировать ключ:
String lSig = SigUtils.getOAuth1Signature(query+"_"+expTime, lHashedKey);
И для проверки:
boolean valid = SigUtils.validateUserSignature(expTime, query, lHashedKey, lSig);