2016-10-25 32 views
-1

我遵循鏈接中所述的步驟:http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-integrating-user-pools-with-identity-pools.html將我的用戶池與認證身份集成在一起。但每次我試圖使用身份驗證提供我收到以下錯誤訪問女將S3時間:將用戶池與Amazon Cognito身份驗證提供程序集成在一起

E/CognitoCachingCredentialsProvider: Failure to get credentials com.amazonaws.services.cognitoidentity.model.NotAuthorizedException: Logins don't match. Please include at least one valid login for this identity or identity pool. (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: NotAuthorizedException; Request ID: ff4da8ad-9a96-11e6-9c64-67a5c841c727) 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.getId(AmazonCognitoIdentityClient.java:444) at com.amazonaws.auth.AWSAbstractCognitoIdentityProvider.getIdentityId(AWSAbstractCognitoIdentityProvider.java:172) at com.amazonaws.auth.AWSEnhancedCognitoIdentityProvider.refresh(AWSEnhancedCognitoIdentityProvider.java:76) at com.amazonaws.auth.CognitoCredentialsProvider.startSession(CognitoCredentialsProvider.java:561) 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.putObject(AmazonS3Client.java:1704) at com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.uploadSinglePartAndWaitForCompletion(UploadTask.java:203) at com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.call(UploadTask.java:85) at com.amazonaws.mobileconnectors.s3.transferutility.UploadTask.call(UploadTask.java:44) at java.util.concurrent.FutureTask.run(FutureTask.java:234) 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:864).

下面是代碼:

public static TransferUtility getTransferUtility(Context context) { 
     if (sTransferUtility == null) { 
      sTransferUtility = new TransferUtility(getS3Client(context.getApplicationContext()), 
        context.getApplicationContext()); 
     } 

     return sTransferUtility; 
    } 



public static AmazonS3Client getS3Client(Context context) { 
     if (sS3Client == null) { 
      sS3Client = new AmazonS3Client(getCredProvider(context.getApplicationContext())); 
     } 
     return sS3Client; 
    } 



private static CognitoCachingCredentialsProvider getCredProvider(Context context) { 
     if (sCredProvider == null) { 
      sCredProvider = new CognitoCachingCredentialsProvider(
        context.getApplicationContext(), 
        Constants.COGNITO_POOL_ID, 
        Regions.EU_WEST_1); 
      Map<String, String> logins = new HashMap<>(); 
      logins.put("cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxxxxxxxx", idToken); 
      sCredProvider.setLogins(logins); 
     } 
     return sCredProvider; 
    } 

在這裏,我如何獲得令牌

AuthenticationHandler authenticationHandler = new AuthenticationHandler() { 
     @Override 
     public void onSuccess(CognitoUserSession cognitoUserSession, CognitoDevice device) { 
      Log.e(TAG, "***Auth Success***"); 
      idToken = cognitoUserSession.getIdToken().getJWTToken(); 
      AppHelper.setCurrSession(cognitoUserSession); 
      AppHelper.newDevice(device); 
      closeWaitDialog(); 
      launchUser(); 
     } 

轉換是com.amazonaws.mobileconnectors.s3.transferutility包的一部分。

謝謝你的幫助。 felini

+1

這是沒有免費代碼調試的平臺。 – frieder

+0

對不起,我不在尋找調試。我遵循amazone網站上描述的步驟來將用戶池與認知身份相集成。不過,我總是無法獲得憑據。如果有人能告訴我爲什麼它會很棒! – Felini500

+0

問題解決! – Felini500

回答

1

問題可能是配置或您創建令牌的方式(提供者名稱部分看起來正確)。但很可能你只需要GetIdResult。

「登錄名不匹配,請至少包含一個有效的身份或身份池登錄名。」是來自「AWSCognitoIdentityService.GetCredentialsForIdentity」api請求(在Java中,我認爲它是GetCredentialsForIdentityResult)

這可能發生在對一個身份擁有identityId,然後爲另一個身份提供登錄時。如果你改變身份,你需要做一個「AWSCognitoIdentityService.GetId」(在java中,我認爲這是GetIdResult)

錯誤是告訴你它或者找不到與身份池或者池相關的身份提供者沒有配置該身份提供者(我認爲這會產生不同的錯誤但不確定),或者它不能將身份標識與登錄條目標記相關聯(如果ID標識中的用戶名聲明與其實例中的標識不匹配)。

我認爲你需要修正你的登錄詞典,或者做一個GetIdResult調用,以確保你有正確的身份標識符爲你提供的登錄哈希。

或...如果是配置,請確保您已將用戶池和客戶端ID在身份驗證提供程序列表中正確配置爲Cognito用戶池身份驗證提供程序。請注意,如果您還在IAM中將其配置爲身份提供商,則必須讓受衆羣體匹配相同的客戶端ID。 (也有效)。

注意:如果您配置了「未經身份驗證」訪問,然後嘗試使用登錄哈希獲取憑據,但使用未經身份驗證的身份,則可能會發生此問題。我認爲你需要做一個getIdResult來切換。

0

這是一個配置問題。我添加到現有的身份池Cognit用戶池作爲身份驗證提供程序。我提供了用戶池ID和客戶端ID。

然後我點擊保存更改。它在儀表板上顯示爲綠色,表示我的更改已保存。但事實上並非如此!這是錯誤的原因。

作爲解決方案,我從頭開始創建一個新的身份池,並在創建期間添加認證用戶池作爲身份驗證提供程序。只有在創建池後才能正確保存。

0

如果任何人有同樣的警告,就可以登錄到Cognito身份池與未經驗證的電子郵件,但相同的用戶將不能夠授權對一個Cognito身份提供者,而不是這個錯誤會被拋出:

Error: Logins don't match. Please include at least one valid login for this identity or identity pool.

用戶可以通過Cognito控制檯設置爲'確認'。這並不等同於'驗證郵件'。用戶可以登錄到池但。

完全未經確認的用戶根本無法登錄。

相關問題