【问题标题】:aws s3 - browser upload using post - gwt & javaaws s3 - 使用 post-get 和 java 上传浏览器
【发布时间】:2015-10-08 20:48:14
【问题描述】:

我正在开发一个 wgt webapp,并希望将文件从浏览器上传到 s3。 由于我的凭据在服务器上,我需要在服务器上创建签名并将其发送到客户端才能进行 ulpoad。

这是我正在使用的代码: -dateStamp 格式正确 - yyyyMMdd -policy 是 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 = "0123456789ABCDEF".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);
}

使用生成的签名,我收到一条错误消息: 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

我做错了什么? 有什么好的教程或示例代码可以做到这一点吗?

谢谢!

【问题讨论】:

    标签: amazon-web-services gwt amazon-s3 upload


    【解决方案1】:

    AWS 签名流程发生了变化 - 目前(2016 年 5 月)的版本是 AWS 签名版本 4 (http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)。在查看示例和 Stackoverflow 等时,您需要小心这些信息与您使用的相同签名版本相关,因为它们不能很好地混合。

    我开始使用 AWS 开发工具包进行 angular/node 文件上传,但最终发现在没有开发工具包的情况下更容易在服务器 (node.js) 端生成策略。这里有一个很好的例子(尽管基于节点的可能不是您要找的):https://github.com/danialfarid/ng-file-upload/wiki/Direct-S3-upload-and-Node-signing-example(但请注意此处 S3 存储桶名称的问题:AngularJs Image upload to S3)。

    要注意的一个关键点是您在策略生成中正确包含文件内容类型,并且此内容类型与您实际上传的文件的内容类型正确匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 2016-05-23
      相关资源
      最近更新 更多