首页 > 解决方案 > 如何在 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 完成

标签: androidamazon-web-servicesamazon-cognitoincognito-modeawss3transferutility

解决方案


我终于找到了一些文档来解决这个问题。基本上,您将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.PoolId这与 CognitoUserPool.Default.PoolId!

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

推荐阅读