[英]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下载文件,需要执行以下步骤:
因此,如果我理解正确,之前提到的登录过程应该保存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(),
"us-east-1:dbacd6aa-9393-475e-b687-xxxxxxxxx", // Your Identity Pool ID
Regions.US_EAST_1 // Your Region
);
如果您不想每次都创建它,那么您可以在单独的类中编写此代码,并使用setter和getter方法来使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.