我想知道是否有人可以帮助我了解 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 下载文件,需要执行以下步骤:
- 您首先使用 BasicAWSCredentails 类创建用于访问 S3 的 AWS 凭证
- 将 AWS 凭证传递给 AmazonS3 实例
- 然后将 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 的代码,因为这有点过时了我的联盟!)