繁体   English   中英

Android:用户登录Amazon Cognito并从Amazon S3传输数据

[英]Android: user login Amazon cognito and transfer data to and from Amazon S3

我想知道是否有人可以帮助我在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

关于用户可以下载的个人文件,每个用户都在应用程序的桶中获取自己的文件(只有一个桶,因为我不想为每个用户创建一个单独的桶),只有这个登录用户才有权下载这个文件。 我已经编写(采用并改编自其他人)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类创建AWS Credentials以访问S3
  2. 将AWS Credentials传递给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).

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

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

有谁可以帮我这个???

-------------------------------- UPDATE ----------------- ----------

一些额外的信息,为那些不太熟悉这个主题的人,但仍然想帮助我:)

这是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(或者我可以)使用用户登录的凭据(无需从头开始构建登录活动,而不是使用亚马逊的代码,因为这有点过时了我的联赛!)

您可以像这样创建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方法来使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM