2016-07-01 4 views
0

Ich möchte Webservice mit Api-Gateway aufrufen, aber ein Problem mit Cognito. aber die Anwendung stürzt ab, ich habe keine Ahnung davon, bitte Jungs helfen, es zu lösen !!! mein Code ist wie untenCrash-Anwendung durch ApiClientException in Api Gateway

AwsActivity.java

class AwsActivity extends Activity { 
private String AMAZON_COGNITO_IDENTITY_POOL_ID = "us-east-1**********"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     new MyAsyncTask("1").execute(); 
    } 

    private class MyAsyncTask extends AsyncTask<String, Void, String> { 
     private String userId = ""; 

     public MyAsyncTask(String userId) { 
      this.userId = userId; 
      Log.d("111111111111", "111111111111"); 
     } 

     @Override 
     protected String doInBackground(String... strings) { 
      Log.d("22222222222222222", "2222222222222222222"); 
      AWSCredentialsProvider credenetialsProvider = new CognitoCachingCredentialsProvider(
        AwsActivity.this,   // activity context 
        AMAZON_COGNITO_IDENTITY_POOL_ID, // Cognito identity pool id 
        Regions.US_EAST_1 // region of Cognito identity pool 
      ); 
      ApiClientFactory factory = new ApiClientFactory() 
        .credentialsProvider(credenetialsProvider) 
        .region("us-east-1") 
        .endpoint("https://abcd") 
        .apiKey("gsjddjflkjdsljaskds"); 

      // MyClient is the AWS Android SDK Generated class 

      final MyClient client = factory.build(MyClient.class); 

      client.viewprofileGet(userId); 
      // String str = client.testGet().toString(); 
      Log.d("###", "here after test" + client.viewprofileGet("")); 

      return "DONE"; 
     } 

     @Override 
     protected void onPostExecute(String temp) { 
      Log.d("####", "onPostExecute"); 
     } 
    }} 

MyClient.java

@com.amazonaws.mobileconnectors.apigateway.annotation.Service(endpoint = "https://abcde") 
public interface MyClient { 
    @com.amazonaws.mobileconnectors.apigateway.annotation.Operation(path = "/loginclient", method = "GET") 
    Empty loginclientGet(
      @com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "user_id", location = "query") 
      String userId); 
} 

Log Mein Fehler ist unter

07-01 06:35:17.840 17476-17558/com.example.android.awsapidemo E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
                       java.lang.RuntimeException: An error occured while executing doInBackground() 
                        at android.os.AsyncTask$3.done(AsyncTask.java:299) 
                        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
                        at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
                        at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
                        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
                        at java.lang.Thread.run(Thread.java:841) 


Caused by: com.amazonaws.mobileconnectors.apigateway.ApiClientException: {"Message":"User: arn:aws:sts::686770309549:assumed-role/Cognito_bookmixnewUnauth_Role/CognitoIdentityCredentials is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********9549:abcde/mycleint/GET/login/login"} 
                      (Service: MyClient; Status Code: 403; Error Code: null; Request ID: 80ede0b7-3f77-13435e6-45345-24325435) 
                       at com.amazonaws.mobileconnectors.apigateway.ApiClientHandler.handleResponse(ApiClientHandler.java:240) 
                       at com.amazonaws.mobileconnectors.apigateway.ApiClientHandler.invoke(ApiClientHandler.java:93) 
                       at $Proxy1.viewprofileGet(Native Method) 
                       at com.example.android.awsapidemo.AwsActivity$MyAsyncTask.doInBackground(AwsActivity.java:63) 
                       at com.example.android.awsapidemo.AwsActivity$MyAsyncTask.doInBackground(AwsActivity.java:37) 
                       at android.os.AsyncTask$2.call(AsyncTask.java:287) 
                       at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
                        ... 4 more 
+0

plz Ihre Fehlerprotokolle von logcat hinzufügen –

+0

Ich habe meine Fehler –

+0

bin in der Lage zu sehen, wie dieser log - CognitoIdentityCredentials nicht auszuführen ist berechtigt: können einige Anmeldeinformationen Probleme oder einige api Schlüssel Probleme –

Antwort

0

wie diese

AmazonDynamoDBClient ddbClient = Region.getRegion(Regions.EU_WEST_1) // CRUCIAL 
    .createClient(
     AmazonDynamoDBClient.class, 
     credentialsProvider, 
     new ClientConfiguration() 
    ); 
Versuchen dieser Wert

prüfen

Region.getRegion (Regions.EU_WEST_1) // CRUCIAL

, wenn Ihre Datenbank in einer anderen Region Sie es properly.other weise es nicht

arbeiten angeben müssen
+0

Danke Lass mich versuchen !!! –

+0

lassen Sie mich wissen, es funktioniert oder nicht –

+0

Entschuldigung !!! es funktioniert nicht für mich. –

1

Der Schlüssel Detail in Ihrem Fehlerprotokoll ist diese Nachricht:

„Benutzer: arn: aws: M. :: 686770309549: assumed-Rolle/Cognito_bookm ixnewUnauth_Role/CognitoIdentityCredentials kann nicht ausgeführt werden: execute-api: Auf Ressource aufrufen: arn: aws: execute-api: us-oest-1: ******** 9549: abcde/myclet/GET/login/login "

Jedem Cognito-Identitätspool ist eine Rolle zugeordnet. Sie müssen Ihrer Rolle eine Richtlinie hinzufügen, um ihr Berechtigungen für die Aktion "execute-api: Invoke" für den oben angegebenen Ressourcen-ARN zu erteilen.

Die Politik sollte wie folgt aussehen:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "execute-api:Invoke"   
     ], 
     "Resource": [ 
     "arn:aws:execute-api:us-east-1:********9549:abcde/mycleint/GET/login/login" 
     ] 
    } 
    ] 
} 

Auch der Ressourcenpfad in Ihrem ARN sieht seltsam aus, so überprüfen Sie, dass Sie die richtige URL für den Aufruf API gebaut. Das allgemeine Format für die ARN ist:

arn:aws:execute-api:us-east-1:my-aws-account-id:my-api-id/my-stage/GET/my-resource-path

Base auf dem ARN in Ihrem Fehlerprotokoll, die wir haben:

my-aws-account-id: ********9549 
my-api-id: abcde 
my-stage: mycleint 
HTTP method: GET 
my-resource-path: /login/login` 

Ist "mycleint" der Name Ihrer Bühne?

Ist der Ressourcenpfad wirklich "/ login/login"?

Außerdem scheint es etwas seltsam, sowohl einen Cognito-Identitätspool als auch eine benutzerdefinierte Anmeldemethode zu verwenden. Normalerweise benutzen Leute das eine oder andere. Bei dieser Konfiguration muss sich der Benutzer über den Cognito-Identitätspool authentifizieren, bevor er die benutzerdefinierte Anmeldemethode aufrufen kann.