如何在 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"));

https://github.com/awsdocs/aws-mobile-developer-guide/blob/master/doc_source/how-to-transfer-files-with-transfer-utility.rst

此外,还有两个警告我必须弄清楚才能在不接收 HTTP 403 的情况下完成这项工作:

  1. 将所需信息添加到 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.PoolIdCognitoUserPool.Default.PoolId!

  1. 如果需要,根据服务器端配置,在执行上传时将 "private"/"public" 前缀添加到 key