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