当前位置: 首页 > 知识库问答 >
问题:

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

鲜于岳
2023-03-14

我有一个JavaPython集成问题,我从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"}}

Python中预签名URL的使用示例:

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

然而,Java使用的实际URL以某种方式进行了参数化/编码:

https://my-bucket-us-west-2.s3.us-west-2.amazonaws.com/caseId=02_mock/dummy.encrypted?X-Amz算法=AWS4-HMAC-SHA256

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的JavaLambda更好吗?

共有1个答案

鞠安民
2023-03-14

Python还可以为任何HTTP方法生成一个一体化的编码URL,因为这是预签名URL的默认形式。我创建了一个测试python脚本,以确保一切正常。如果运行此操作(在导出凭据并用适当的bucket/object键替换变量后),您将获得一个编码的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后操作会很好,只要您确保传入正确的Httpmethod。(参考)

 类似资料:
  • 如果你想把自己的资源发放给第三方用户访问,但是又不想开放Bucket的读权限,可以通过生成预签名URL的形式提供给用户一个临时的访问URL。在生成URL时,你可以指定URL过期的时间,从而限制用户长时间访问。 生成一个预签名的URL 如下代码: String bucketName = "your-bucket-name"; String key = "your-object-key"; // 设

  • 如果你想把自己的资源发放给第三方用户访问,但是又不想开放Bucket的读权限,可以通过生成预签名URL的形式提供给用户一个临时的访问URL。在生成URL时,你可以指定URL过期的时间,从而限制用户长时间访问。 生成预签名URL来获取Object <?php $url = $client->generatePresignedUrl(array( 'Bucket' => 'your-buck

  • 我按照https://docs.aws.amazon.com/amazons3/latest/dev/shareObjectPresignedurlJavasdk.html中的示例创建预签名的s3 url(v4),当我试图访问签名的url时,会出现Access Denied错误 下面是代码段 签名格式似乎是正确的,我不确定是否遗漏了其他一些s3客户端配置。由于我没有得到签名不匹配错误或无效的url

  • 我知道水桶是存在的。当我通过AWS Web GUI导航到此项目并双击它时,它将打开带有URL的对象,并且运行良好: 所以我认为我在使用SDK时肯定做错了什么。

  • 我正在开发java web应用程序,现在我正在尝试将我的网站与QTIWorks连接起来 我有一个消费者密钥和秘密,我需要生成OAuth签名通过线性时不变系统与QTIWorks连接 我需要在这行生成OAuth签名 我该怎么做?

  • 最近我需要在Java中使用RSA对一个字符串进行签名,并在C++中验证签名。 在Java,现在我认为一切都是好的,我创建了public.keystore和private.keysore,可以成功地对数据进行签名和veify。但是当我试图用C++验证它时,它显示签名失败。 这是我的Java代码,在Java,我将数据签名到base64String,并将其保存在我的本地文件中,保存为“sig.dat”,