在Python中生成预签名URL,然后在Java中使用它



我有一个Java-Python集成问题,我从Python Lambda收到一个预签名的URL, Java桌面客户端实际上正在使用该URL执行多部分上传。

我面临的问题的本质是Python和Java使用预先指定的URL的方式是完全不同的。Python使用像

这样的JSON对象
{"url":"https://some-bucket-us-west-2.s3.amazonaws.com/","fields":{"key":"my_object_key","AWSAccessKeyId":"XXXXXXXXXXX","x-amz-security-token":"my_token","policy":"my_policy","signature":"my_sig"}}

预签名URL在Python中的示例用法:

requests.post(returned_url_response['url'], data=returned_url_response['fields'], files=files)

然而,Java使用了一个实际的URL,它以某种方式被参数化/编码:

https://my桶-我们-西方- 2. - 2. s3.us -西方- amazonaws.com/caseid%3d02_mock/dummy.encrypted?x湄京- algorithm=aws4 hmac - sha256& X-Amz-Date = 20210924 t184139z& X-Amz-SignedHeaders = host& X-Amz-Expires = 3599, X-Amz-Credential = some_credentialFaws4_request& X-Amz-Signature = some_hash

Java中预签名URL的示例用法:

URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

// Create the connection and use it to upload the new object using the pre-signed URL.
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("PUT");
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream())

我的问题是,如果有一个Java等效做我在Python做什么,这样我仍然可以使用Python生成的输出?

或者在Python lambda中使用generate_presigned_url()生成我可以从Java应用程序使用的URL吗?我是否需要为每个ClientMethod操作create_multipart_upload, upload_part, complete_multipart_upload生成一个预签名的URL ?

最后,这两种方法中的任何一种都比扔掉我的Python Lambda并制作一个生成预签名URL的Java Lambda更好吗?

Python还可以为任何HTTP方法生成一个一体化编码的URL,因为这是预签名URL的默认形式。我创建了一个测试python脚本,以确保一切正常工作。如果运行此命令(在导出凭据并用适当的桶/对象密钥替换变量之后),您将得到一个编码的URL输出到控制台:

import boto3
s3 = boto3.client('s3')
url = s3.generate_presigned_url('put_object', Params={'Bucket': bucket, 'Key': object_key},
ExpiresIn=expirationInSeconds,  
HttpMethod=method)
print(url)

很可能你正在使用generate_presigned_post,它返回一个字典而不是你的python lambda的URL,然而,使用generate_presigned_url的post操作将工作良好,只要你确保你在正确的HttpMethod中传递。(引用)

相关内容

最新更新