如何在 Android 中将 TransferUtility 与 Cognito 用户/身份池一起使用
How to use TransferUtility with Cognito user / Identity pools in Android
我需要将 Android 中的一个文件上传到 s3 存储桶。
我们想使用 Cognito 用户池对上传进行身份验证。
执行此操作的标准方法是使用 Amazon Amplify SDK 中的存储 API。
问题是我上传需要报告上传进度,而Amplify Storage不允许你设置监听器来观察Android中的Progress。
这让我需要使用 TransferUtility
。
我应该如何使用带有 TransferUtility 的 Cognito 验证上传操作?
目前我在做:
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
!
- 如果需要,根据服务器端配置,在执行上传时将 "private"/"public" 前缀添加到
key
。
我需要将 Android 中的一个文件上传到 s3 存储桶。 我们想使用 Cognito 用户池对上传进行身份验证。
执行此操作的标准方法是使用 Amazon Amplify SDK 中的存储 API。
问题是我上传需要报告上传进度,而Amplify Storage不允许你设置监听器来观察Android中的Progress。
这让我需要使用 TransferUtility
。
我应该如何使用带有 TransferUtility 的 Cognito 验证上传操作?
目前我在做:
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
!
- 如果需要,根据服务器端配置,在执行上传时将 "private"/"public" 前缀添加到
key
。