Я делаю Android-приложение с S3, чтобы пользователь мог загружать файлы на сервер S3. Для токенов AWS мы используем наш собственный сервер, чтобы получить следующее.AWS S3 - Как правильно получить учетные данные для Android?
AwsToken.java является POJO для следующего json.
{
"id": "us-east-1:xxxxx",
"token": "xxxxx",
"region": "us-east-1",
"identityPoolId": "us-east-1:xxxxx",
"loginProvider": "xxxxx"
}
Тогда я пытаюсь использовать это для создания identityProvider и credentialsProvider получить AmazonS3Client и TransferUtility.
KOIAWSAuthenticatedIdentityProvider identityProvider = new KOIAWSAuthenticatedIdentityProvider(awsToken);
CognitoCachingCredentialsProvider cognitoCachingCredentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(), // Context
identityProvider,
Regions.US_EAST_1 // Region
);
AmazonS3Client sS3Client = new AmazonS3Client(cognitoCachingCredentialsProvider);
TransferUtility transferUtility = new TransferUtility(sS3Client, getApplicationContext());
KOIAWSAuthenticatedIdentityProvider.java
package com.krossover.network.aws;
import com.amazonaws.auth.AWSCognitoIdentityProvider;
import com.amazonaws.auth.IdentityChangedListener;
import com.krossover.network.models.AWSToken;
import java.util.Map;
/**
* Created by paulshin on 9/26/16.
*/
public class KOIAWSAuthenticatedIdentityProvider implements AWSCognitoIdentityProvider {
private AWSToken awsToken;
public KOIAWSAuthenticatedIdentityProvider(AWSToken awsToken) {
this.awsToken = awsToken;
}
@Override
public String getIdentityId() {
return awsToken.id;
}
@Override
public String getIdentityPoolId() {
return awsToken.identityPoolId;
}
@Override
public void setLogins(Map<String, String> loginsMap) {
}
@Override
public Map<String, String> getLogins() {
return null;
}
@Override
public boolean isAuthenticated() {
return true;
}
@Override
public void registerIdentityChangedListener(IdentityChangedListener listener) {
}
@Override
public void unregisterIdentityChangedListener(IdentityChangedListener listener) {
}
@Override
public void identityChanged(String newIdentity) {
}
@Override
public void clearListeners() {
}
@Override
public String getToken() {
return awsToken.token;
}
@Override
public String refresh() {
return null;
}
}
Проблема заключается в том, что я получаю эту ошибку
E/CognitoCachingCredentialsProvider: Failure to get credentials
com.amazonaws.services.cognitoidentity.model.NotAuthorizedException: Access to Identity 'us-east-1:xxxxx' is forbidden. (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: NotAuthorizedException; Request ID: xxxxx)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:712)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:388)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:199)
at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.invoke(AmazonCognitoIdentityClient.java:558)
at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.getCredentialsForIdentity(AmazonCognitoIdentityClient.java:388)
at com.amazonaws.auth.CognitoCredentialsProvider.populateCredentialsWithCognito(CognitoCredentialsProvider.java:651)
at com.amazonaws.auth.CognitoCredentialsProvider.startSession(CognitoCredentialsProvider.java:577)
at com.amazonaws.auth.CognitoCredentialsProvider.getCredentials(CognitoCredentialsProvider.java:371)
at com.amazonaws.auth.CognitoCachingCredentialsProvider.getCredentials(CognitoCachingCredentialsProvider.java:441)
at com.amazonaws.auth.CognitoCachingCredentialsProvider.getCredentials(CognitoCachingCredentialsProvider.java:76)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4369)
at com.amazonaws.services.s3.AmazonS3Client.initiateMultipartUpload(AmazonS3Client.java:3287)
at com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.initiateMultipartUpload(UploadTask.java:252)
at com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.uploadMultipartAndWaitForCompletion(UploadTask.java:100)
at com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.call(UploadTask.java:80)
at com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.call(UploadTask.java:44)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
E/UploadTask: Error initiating multipart upload: 31 due to Access to Identity 'us-east-1:xxxxx' is forbidden. (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: NotAuthorizedException; Request ID: xxxxx)
Наши IOS приложение имеет очень похожую логику и она отлично работает и никогда не получал доступ запрещен ошибка , Я не знаю, почему я получаю его из библиотеки Android.
FYI, это IOS аналог KOIAWSAuthenticatedIdentityProvider.java
class KOIAWSAuthenticatedIdentityProvider: AWSCognitoCredentialsProviderHelper {
private var awsToken: String
init(regionType: AWSRegionType,
identityPoolId: String,
providerName: String,
identityId: String,
token: String)
{
self.awsToken = token
super.init(
regionType: regionType,
identityPoolId: identityPoolId,
useEnhancedFlow: true,
identityProviderManager: nil)
self.identityId = identityId
}
override func token() -> AWSTask {
return AWSTask(result: self.awsToken)
}
}
Я вижу различие Android не имеет ничего общего с useEnhancedFlow: правда»..
Каждый имеет какие-либо идеи ? Спасибо ..