【问题标题】:How to use TransferUtility with Cognito user / Identity pools in Android如何在 Android 中将 TransferUtility 与 Cognito 用户/身份池一起使用
【发布时间】:2019-12-17 10:58:13
【问题描述】:

我需要将 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 完成

【问题讨论】:

    标签: android amazon-web-services amazon-cognito incognito-mode awss3transferutility


    【解决方案1】:

    我终于找到了一些文档来解决这个问题。 基本上,您使用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”前缀。

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 1970-01-01
      • 2017-02-28
      • 2016-09-26
      • 2018-02-11
      • 2016-10-23
      • 2017-02-10
      • 2021-06-08
      • 2016-11-10
      相关资源
      最近更新 更多