3

我想知道是否有人可以帮助我了解 android 中的以下概念。我希望用户使用 amazon cognito 创建一个帐户并登录我的应用程序,以识别他们的身份。用户登录后,该用户可以从 Amazon S3 下载个人文件。

我实现了 AWS Mobile Hub 提供的有关登录的代码,一切似乎都运行良好:我能够通过我的应用程序创建一个测试账户并登录没有错误。显然我无法测试后端,因为 S3 部分给我带来了麻烦。登录代码非常基本,如下所示:

public class AuthenticatorActivity_old extends Activity {
    @Override    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() {
            SignInUI signin = (SignInUI) AWSMobileClient.getInstance().getClient(AuthenticatorActivity_old.this, SignInUI.class);
            signin.login(AuthenticatorActivity_old.this, home.class).execute();
        }).execute();        
    }
}

此代码适用于一堆 Amazon 库和 awsconfiguration.json 文件,我假设它声明了 credentialsProvider

关于用户可以下载的个人文件,每个用户在应用的bucket中都有自己的文件(只有一个bucket,因为我不想为每个用户创建一个单独的bucket),并且只有这个登录的用户有下载权限这个文件。我已经编写(采用并改编自其他人)一个看起来像这样的 IAM 策略,如果我理解正确,它只允许用户下载名称为 [bucket]/cognito/[username]/fixedfilename.jpg 的文件:

{
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": ["s3:ListBucket"],
              "Resource": ["arn:aws:s3:::<BUCKET-NAME>"],
              "Condition": {"StringLike": {"s3:prefix": ["cognito/<APPLICATION-NAME>/"]}}
            },
            {
              "Effect": "Allow",
              "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
              ],
              "Resource": [
                "arn:aws:s3:::<BUCKET-NAME>/cognito/<APPLICATION-NAME>/${cognito-identity.amazonaws.com:sub}",
                "arn:aws:s3:::<BUCKET-NAME>/cognito/<APPLICATION-NAME>/${cognito-identity.amazonaws.com:sub}/*"
              ]
            }
          ]
}

我认为我到目前为止一切都很好(无法全部测试,所以我不确定)。但现在是棘手的部分。要从 S3 下载文件,需要执行以下步骤:

  1. 您首先使用 BasicAWSCredentails 类创建用于访问 S3 的 AWS 凭证
  2. 将 AWS 凭证传递给 AmazonS3 实例
  3. 然后将 AmazonS3 对象传递给 TransferUtility 类

所以如果我理解正确的话,前面提到的登录过程应该会保存 AWS 凭证。此凭据文件针对我的存储桶和登录用户的凭据量身定制。

AWS Mobile Hub 只是告诉我去https://docs.aws.amazon.com/aws-mobile/latest/developerguide/add-aws-mobile-user-data-storage.html#add-aws-mobile- user-data-storage-app并实现它。即使我使用提供的确切代码,我仍然收到错误:AmazonS3 client is required please set using .s3Client(yourClient).

亚马逊似乎提供了一个损坏的代码。看看这个 AmazonS3client 是什么AmazonS3 s3 = new AmazonS3Client(credentialsProvider);,我再次看到了 credentialsProvider。在登录过程中创建(我假设)但我无法提取的那个,因为它隐藏在 Amazon 的库和 awsconfiguration.json 中(我再次假设。这里有很多黑匣子)。

我迷失在亚马逊提供的许多文档/教程/示例应用程序中,而且似乎他们最近进行了更新,使一些在线文本变得无关紧要。

有没有人可以帮我解决这个问题???

- - - - - - - - - - - - - - - - 更新 - - - - - - - - - ----------

对于不太熟悉该主题但仍想帮助我的人的一些附加信息:)

这是 Amazon 为上传到 S3 提供的代码(结合 awsconfiguration.json 文件):

public class YourActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uploadData();
    }

   public void uploadData() {

   TransferUtility transferUtility =
         TransferUtility.builder()
               .context(getApplicationContext())
               .awsConfiguration(awsConfig)
               .build();

   TransferObserver uploadObserver =
         transferUtility.upload(
               "s3Folder/s3Key.txt",
               new File("/path/to/file/localFile.txt"));

   uploadObserver.setTransferListener(new TransferListener() {

     ..... some more code

错误发生在 Transferutility.builder 中,我希望将其更改如下:

AmazonS3 s3Client = new AmazonS3Client(credentialsProvider);

                      TransferUtility.builder()
                        .s3Client(s3Client) <------------this one
                        .context(getApplicationContext())
                        .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
                        .build();

关键是我不能使用用户登录凭据来拥有 S3Client(或者我可以吗???)(无需从头开始构建登录活动,而不是使用 Amazon 的代码,因为这有点过时了我的联盟!)

4

1 回答 1

1

您可以像这样创建 CredentialsProvider 的对象:

CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
            getApplicationContext(),
            &quot;us-east-1:dbacd6aa-9393-475e-b687-xxxxxxxxx&quot;, // Your Identity Pool ID
            Regions.US_EAST_1 // Your Region
    );

如果您不想每次都创建它,那么您可以在单独的类中编写此代码并使用 setter 和 getter 方法来使用它。

于 2017-11-23T07:54:43.690 回答