android - 如何在 Android 中将 TransferUtility 与 Cognito 用户/身份池一起使用
问题描述
我需要将 Android 中的一个文件上传到 s3 存储桶。我们想使用 Cognito 用户池对上传进行身份验证。
执行此操作的标准方法是使用 Amazon Amplify SDK 中的存储 API。
问题是我需要为上传报告上传进度,而 Amplify Storage 不允许您设置监听器来观察 Android 中的进度。
这使我需要使用TransferUtility
.
我应该如何使用 Cognito 和 TransferUtility 对上传操作进行身份验证?
目前我正在做:
val credentials = CognitoCachingCredentialsProvider(
context,
"eu-west-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
Regions.US_WEST_1)
val s3Client = AmazonS3Client(credentials, Region.getRegion(Regions.US_WEST_1))
val transferUtility = TransferUtility.builder()
.context(context)
.s3Client(s3Client)
.build()
但我得到一个 403:
com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXXXXXX), S3 Extended Request ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx=
我真的很难为此获得任何文档,因为现在似乎Storage
首选 API TransferUtility
,并且与 Cognito 用户池或用户身份有关的所有事情都通过 Amplitude Storage 完成
解决方案
我终于找到了一些文档来解决这个问题。基本上,您将AWSMobileClient
其用作AWSConfiguration
构建TransferUtility
TransferUtility transferUtility =
TransferUtility.builder()
.context(getApplicationContext())
.awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
.s3Client(new AmazonS3Client(AWSMobileClient.getInstance().getCredentialsProvider()))
.build();
TransferObserver uploadObserver =
transferUtility.upload(
"s3Folder/s3Key.txt",
new File("/path/to/file/localFile.txt"));
此外,在不接收 HTTP 403 的情况下,我还必须弄清楚其他两个警告:
- 将所需信息添加到
awsconfiguration.json
{
"IdentityManager": {
"Default": {}
},
"CognitoUserPool": {
"Default": {
"PoolId": "region_XXXXXXX",
"AppClientId": "XXXXXXXXXXXXXXX",
"Region": "XXXXX"
}
},
"CredentialsProvider": {
"CognitoIdentity": {
"Default": {
"PoolId": "XXXXX:XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"Region": "XXXXXX"
}
}
},
"S3TransferUtility": {
"Default": {
"Bucket": "XXXXXXXXXXXXXXXXXXX-data-bucket",
"Region": "XXXXXX"
}
}
}
请注意,CredentialsProvider.CognitoIdentity.Default.PoolId
这与
CognitoUserPool.Default.PoolId
!
key
如果需要,根据服务器端配置,在执行上传时将“private”/“public”前缀添加到。
推荐阅读
- angular - 'Post' 类型的参数不能分配给'string | 类型的参数 象征'
- python - Python更改JSON文件而不更新整个文件
- javascript - 如何将 html+javascrip 代码转换为 react-hook
- java - 将 JSON 字符串反序列化为包装泛型类的类
- node.js - 猫鼬填充模型嵌套在对象中
- javascript - 用户单击图像区域后更改元素的 CSS 样式
- stripe-payments - 使用 customer.subscription.update 而不是 invoice.paid 和 invoice.payment_failed 事件 webhook 来处理 Stripe 订阅
- java - 错误:不兼容的类型:推理变量 T 具有不兼容的界限
- sql - 如何使用相同的数据集更改 2 列或更多列的名称
- agora.io - Agora.io 是否提供类似 whatsapp 的通话功能?