2015-10-08 3 views
0

Я работаю над wgt webapp и хочу загрузить файлы в s3 из браузера. Поскольку мои учетные данные находятся на сервере, мне нужно создать подпись на сервере и отправить ее клиенту, чтобы иметь возможность ulpoad.aws s3 - загрузка браузера с помощью post-gwt & java

вот код, я использую: -dateStamp находится в правильном формате - YYyyMmDd является base64 под политика закодирована - я проверил, что

public static String getSignatureForS3Upload(final String dateStamp, final String policy) { 
    byte[] signingKey = null; 
    byte[] signature = null; 
    String strSignature = null; 
    try { 
     signingKey = AwsUtill.getSignatureKey(AppConfig.getS3SecretKey(), dateStamp, 
       AppConfigShared.getMyAwsS3RegionName(), "s3"); 
     signature = HmacSHA256(policy, signingKey); 
     strSignature = bytesToHex(signature); 
    } 
    catch (Exception e) { 
     // log 
    } 
    ServerDBLogger.log(Level.INFO, byteArrayToHex(signature)); 
    ServerDBLogger.log(Level.INFO, bytesToHex(signature)); 
    return strSignature; 

private static byte[] HmacSHA256(final String data, final byte[] key) throws Exception { 
    String algorithm = "HmacSHA256"; 
    Mac mac = Mac.getInstance(algorithm); 
    mac.init(new SecretKeySpec(key, algorithm)); 
    return mac.doFinal(data.getBytes("UTF-8")); 
} 

private static byte[] getSignatureKey(final String key, final String dateStamp, final String regionName, 
     final String serviceName) throws Exception { 
    byte[] kSecret = ("AWS4" + key).getBytes("UTF-8"); 
    byte[] kDate = HmacSHA256(dateStamp, kSecret); 
    byte[] kRegion = HmacSHA256(regionName, kDate); 
    byte[] kService = HmacSHA256(serviceName, kRegion); 
    byte[] kSigning = HmacSHA256("aws4_request", kService); 
    return kSigning; 
} 

final protected static char[] hexArray = "ABCDEF".toCharArray(); 
public static String bytesToHex(final byte[] bytes) { 
    char[] hexChars = new char[bytes.length * 2]; 
    for (int j = 0; j < bytes.length; j++) { 
     int v = bytes[j] & 0xFF; 
     hexChars[j * 2] = hexArray[v >>> 4]; 
     hexChars[j * 2 + 1] = hexArray[v & 0x0F]; 
    } 
    return new String(hexChars); 
} 

С genarated подписью я получаю сообщение об ошибке: Подписанная нами подпись запроса не соответствует предоставленной вами подписке. Проверьте свой ключ и метод подписи.

Что я делаю неправильно? Есть ли хороший учебник или образец кода для этого?

Спасибо!

ответ

0

Были внесены изменения в процесс подписки AWS - версия в это время (май 2016 года) - это подпись AWS 4 (http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html). Вы должны быть осторожны, глядя на примеры и Stackoverflow и т. Д., Что информация относится к той же версии сигнатуры, которую вы используете, так как они плохо смешиваются.

Я начал использовать AWS SDK для загрузки файла с угловым/узловым файлом, но в итоге ему было легче создавать политику на стороне сервера (node.js) без SDK. Хороший пример (хотя и основанный на узлах, который может и не быть тем, что вы ищете): https://github.com/danialfarid/ng-file-upload/wiki/Direct-S3-upload-and-Node-signing-example (но обратите внимание на проблему с именем байта S3 здесь: Загрузка изображения AngularJs на S3).

Одним из ключевых моментов в том, что вы правильно указываете тип содержимого файла в генерации политики и что этот тип содержимого правильно соответствует типу содержимого файла, который вы фактически загружаете.

Смежные вопросы