Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JWPlayer和S3:计算的签名与提供的签名不匹配_Javascript_Java_Amazon S3_Jwplayer - Fatal编程技术网

Javascript JWPlayer和S3:计算的签名与提供的签名不匹配

Javascript JWPlayer和S3:计算的签名与提供的签名不匹配,javascript,java,amazon-s3,jwplayer,Javascript,Java,Amazon S3,Jwplayer,我正在尝试使用AWSS3将视频上传到JWPlayer 我的后端是在Spring中编码的,所以我使用Java。我设法请求上传URL,但每次我试图用它提交POST请求时,AWS都会返回一个“SignatureDesNotMatch”错误 没有s3,它工作得很好。。。从这个意义上讲,文档不是很清楚。。。从头到尾没有一个很好的例子,我的意思是,一个完整过程的例子:身份验证、url请求和视频上传。所以我在努力理解这里的问题是什么 使用此方法,我可以获得更新url public String createV

我正在尝试使用AWSS3将视频上传到JWPlayer

我的后端是在Spring中编码的,所以我使用Java。我设法请求上传URL,但每次我试图用它提交POST请求时,AWS都会返回一个“SignatureDesNotMatch”错误

没有s3,它工作得很好。。。从这个意义上讲,文档不是很清楚。。。从头到尾没有一个很好的例子,我的意思是,一个完整过程的例子:身份验证、url请求和视频上传。所以我在努力理解这里的问题是什么

使用此方法,我可以获得更新url

public String createVideo(String title, String description, String username) throws UnsupportedEncodingException {
        Map<String, String> params = new HashMap<>();
        String nonce = generateNonce(8);
        String timestamp = Long.toString(System.currentTimeMillis() / 1000L);
        params.put("api_format", "json");
        params.put("author", username);
        params.put("title", title);
        params.put("description", description);
        params.put("upload_method", "s3");
        params.put("api_key", jwPlayerConfig.getKey());
        params.put("api_nonce", nonce);
        params.put("api_timestamp", timestamp);
        params.put("api_signature", generateAPISignature(params, jwPlayerConfig.getSecret()));
        String urlParameters = getParamsString(params);
        String response = requestAuthenticationToken(jwPlayerConfig.getUrl() + jwPlayerConfig.getCreateVideoUrl(), urlParameters);
        JSONObject myObject = new JSONObject(response.toString());
        System.out.println(myObject);
        JSONObject link = myObject.getJSONObject("link");
        return "https://" + link.getString("address") + link.getString("path") +
                "?api_format=json" +
                "&redirect_address=" + jwPlayerConfig.getCreateVideoRedirectAddress() +
                "&key_in_path=True" +
                "&AWSAccessKeyId=" + link.getJSONObject("query").getString("AWSAccessKeyId") +
                "&Expires=" + link.getJSONObject("query").get("Expires").toString() +
                "&Signature=" + link.getJSONObject("query").getString("Signature");
    }
public String createVideo(字符串标题、字符串描述、字符串用户名)引发UnsupportedEncodingException{
Map params=新的HashMap();
字符串nonce=generateNonce(8);
字符串时间戳=Long.toString(System.currentTimeMillis()/1000L);
参数put(“api_格式”、“json”);
参数put(“作者”,用户名);
参数put(“标题”,标题);
参数put(“说明”,说明);
参数put(“上传方法”,“s3”);
put(“api_key”,jwPlayerConfig.getKey());
参数put(“api_nonce”,nonce);
参数put(“api_时间戳”,时间戳);
put(“api_签名”,generateApsignature(params,jwPlayerConfig.getSecret());
字符串urlParameters=getParamsString(params);
字符串响应=requestAuthenticationToken(jwPlayerConfig.getUrl()+jwPlayerConfig.getCreateVideoUrl(),urlParameters);
JSONObject myObject=新的JSONObject(response.toString());
System.out.println(myObject);
JSONObject link=myObject.getJSONObject(“link”);
返回“https://”+link.getString(“地址”)+link.getString(“路径”)+
“?api_格式=json”+
“&redirect_address=“+jwPlayerConfig.getCreateVideoRedirectAddress()+
“&key\u in\u path=True”+
“&AWSAccessKeyId=“+link.getJSONObject(“查询”).getString(“AWSAccessKeyId”)+
“&Expires=“+link.getJSONObject(“查询”).get(“Expires”).toString()+
“&Signature=“+link.getJSONObject(“查询”).getString(“签名”);
}
此方法由Spring的控制器方法调用,它使用这些其他方法来生成上载url:

public String generateAPISignature(Map<String, String> params, String api_secret){
        final Map<String, String> sorted = params.entrySet()
                .stream()
                .sorted(Comparator.comparing(Map.Entry::getKey))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        StringBuilder concat = new StringBuilder();
        for(String key: sorted.keySet()){
            concat.append(key);
            concat.append("=");
            concat.append(sorted.get(key));
            concat.append("&");
        }
        concat.delete(concat.length() - 1, concat.length());
        concat.append(api_secret);
        return DigestUtils.sha1Hex(concat.toString());
    }
public String generateApsignature(映射参数、字符串api_secret){
最终映射排序=params.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry::getKey))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(e1,e2)->e1,LinkedHashMap::new));
StringBuilder concat=新的StringBuilder();
for(字符串键:sorted.keySet()){
concat.append(键);
concat.追加(“=”);
concat.append(sorted.get(key));
附加物(“&”);
}
删除(concat.length()-1,concat.length());
concat.append(api_secret);
返回DigestUtils.sha1Hex(concat.toString());
}
此方法生成一个nonce:

public static String generateNonce(int length){
        Random rnd = new Random();
        StringBuilder nonce = new StringBuilder();
        do{
            nonce.append(rnd.nextInt(10));
        }while(nonce.length() < length);
        return nonce.toString();
    }
publicstaticstringgenerateOnce(int-length){
随机rnd=新随机();
StringBuilder nonce=新的StringBuilder();
做{
暂时追加(rnd.nextInt(10));
}while(nonce.length()
另一个从参数映射构建参数字符串:

public String getParamsString(Map<String, String> params) throws UnsupportedEncodingException {
        StringBuilder result = new StringBuilder();

        for (Map.Entry<String, String> entry : params.entrySet()) {
            result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
            result.append("&");
        }

        String resultString = result.toString();

        return resultString.length() > 0
                ? resultString.substring(0, resultString.length() - 1)
                : resultString;
    }
公共字符串getParamsString(映射参数)引发不支持的编码异常{
StringBuilder结果=新建StringBuilder();
对于(Map.Entry:params.entrySet()){
append(URLEncoder.encode(entry.getKey(),“UTF-8”);
结果。追加(“=”);
append(URLEncoder.encode(entry.getValue(),“UTF-8”);
结果。追加(&);
}
字符串resultString=result.toString();
返回resultString.length()>0
?resultString.substring(0,resultString.length()-1)
:resultString;
}
html表单如下所示:

<form method="POST" action="url">
    <input type="file" name="file" id="file"/>
    <button type="submit">Upload video</button>
</form>

上传视频
我收到的错误消息如下:

signaturedesnotmatch请求 我们计算的签名与您提供的签名不匹配。 检查您的密钥和签名方法。 AKKSAJBCJBSbXC3NQ桩 应用程序/x-www-form-urlencoded 1567098922 /jwplatformupload/Qsafas6vB WWbjcskWBKlc/BLxbm6/RJg57u7M= 50 4f 53 54 0a 0a 61 70 70 6c 69 63 61 74 69 6f 6e 2f 31 2d 77 77 77 2d 66 6f 72 6d 2d 75 72 6c 65 6e 64 6f 64 64 0a 31 35 36 37 30 39 38 32 32 0a 2f 6a 77 70 6c 23 74 66 6f 72 6d 2d 75 70 6c 6f 61 64 2f 51 72 4e 53 33 36 76 42 8D9AA0A3719CE53F 3x6 NASSASAQ2PEFWMC9GZWP0Y7YFS1FTASAKY39EKTJLWX2USOVIIKQIE8BDCG6PKB4YPXVSH1Q=


试着用PUT,而不是POST。我们在

处有相关文档,我已经尝试过PUT,但它给了我另一个错误:AccessDeniedAccessDenied 5B0299c0ee8cdcdd9 gzxqfqhhqyezeucizgzgh9fkybnn17jtjp0gtyq38fnytabtk6cuq+UoPSXeBNHf8HgQNVXyWvc=