我想请你帮我翻译以下关于Android的概念。我希望用户能够使用Amazon Cognito在我的应用程序上创建账户和登录,以识别他们的身份。一旦用户成功登录,该用户可以从Amazon S3下载个人文件。
我已经按照AWS Mobile Hub提供的代码实现了登录功能,一切似乎都很顺利:我能够通过我的应用程序创建一个测试账户并且没有出现任何错误。显然,由于S3部分出现问题,我无法测试后端的功能。登录的代码非常基本,如下所示:
我认为目前为止我做得还不错(尚未测试完毕,所以不确定)。但现在来到棘手的部分。要从S3下载文件需要执行以下步骤:
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并实现这一点。即使我使用提供的精确代码,我仍然会收到错误:
我在Amazon提供的许多文档/教程/示例应用程序中迷失了方向,而且似乎他们最近进行了更新,使得一些在线文本不相关了。
有人能帮帮我吗??
-------------------------------- 更新 ---------------------------
以下是Amazon提供的与awsconfiguration.json文件结合使用的上传到S3的代码:
错误发生在Transferutility.builder中,我希望将其更改如下:
我已经按照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();
}
}
这段代码与一堆亚马逊库和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下载文件需要执行以下步骤:
- 首先使用BasicAWSCredentails类创建用于访问S3的AWS凭据
- 将AWS凭证传递给AmazonS3实例
- 然后将AmazonS3对象传递给TransferUtility类
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).
看起来Amazon提供了有问题的代码。查看AmazonS3client是什么,AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
,我再次看到了credentialsProvider。它是在登录过程中创建的(我猜测),但我无法提取它,因为它隐藏在Amazon的库和awsconfiguration.json中(我再次猜测。这里有很多黑匣子)。我在Amazon提供的许多文档/教程/示例应用程序中迷失了方向,而且似乎他们最近进行了更新,使得一些在线文本不相关了。
有人能帮帮我吗??
-------------------------------- 更新 ---------------------------
以下是Amazon提供的与awsconfiguration.json文件结合使用的上传到S3的代码:
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的代码,因为那有点超出我的能力范围!)
transferUtility.upload( "s3Folder/s3Key.txt", new File("/path/to/file/localFile.txt"));
您的目标路径可以像这样:"s3Folder/username/fileName.txt"
。 - Rahul Kumar