2016-11-09 10 views
1

Я делаю 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: правда»..

Каждый имеет какие-либо идеи ? Спасибо ..

ответ

0

Доступ к идентификатору x запрещен почти всегда, когда он является аутентифицированным идентификатором (который уже имеет логин, связанный с ним), но делается запрос для этого удостоверения без включения логинов. Cognitoтребует, чтобы при попытке доступа к ней вы предоставляли> = 1 логин, связанный с аутентифицированным идентификатором.

Возможно, вы столкнулись с этой проблемой, поскольку класс, который вы выполняете подкласс, не является правильным. В Cognito docs вам должен быть подкласс AWSAbstractCognitoDeveloperIdentityProvider.

 Смежные вопросы

  • Нет связанных вопросов^_^