2016-04-05 8 views
0

Danke für die Hilfe im Voraus!Amazon Cognito mit iOS: Zugang zu Identität verboten

Ich habe Probleme mit Amazon Cognito, Daten ordnungsgemäß zu speichern/zu synchronisieren.

Auf der dataset.synchronize() Linie (die nicht die Daten in Cognito speichert), erhalte ich einen großen Ausgangsfehler wie (mit ID spielte out):

nicht nil
AWSCredentialsProvider.m line:429 | __73-[AWSCognitoCredentialsProvider 
getCredentialsWithCognito:authenticated:]_block_invoke | GetCredentialsForIdentity 
failed. Error is [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain 
Code=10 "(null)" UserInfo={__type=NotAuthorizedException, message=Access to 
Identity '*****' is forbidden.}] 

Die cognitoID ist richtig und kehrt (und passt die Werte, die ich online lesen kann)

Zum Beispiel, nachdem sie mit Facebook Authentifizierung durchführen ich folgendes:

if (FBSDKAccessToken.currentAccessToken() != nil) 
    { 
     let fbCognitoToken = FBSDKAccessToken.currentAccessToken().tokenString 
     credentialsProvider.logins = [AWSCognitoLoginProviderKey.Facebook.rawValue: fbCognitoToken] 
     // Retrieve your Amazon Cognito ID 
     credentialsProvider.getIdentityId().continueWithBlock { (task: AWSTask!) -> AnyObject! in 
      if (task.error != nil) { 
       print("Error: " + task.error!.localizedDescription) 
      } 
      else { 
       // the task result will contain the identity id 
       let cognitoId = task.result 

       //checking if cognito was successful, if true, sets success condition to true to prepare for segue into app 
       if cognitoId != nil{ 
        print (cognitoId) 
        cognitoSuccess = true 

        let syncClient = AWSCognito.defaultCognito() 

        let dataset = syncClient.openOrCreateDataset("User_Data") 
        dataset.setString("[email protected]", forKey:"Email") 
       // credentialsProvider.refresh() 
        dataset.synchronize() 
        } }return nil}} 

ich Daten von Gesicht lesen kann Buch richtig, und alle Authentifizierung erfolgte korrekt von dem, was ich sagen kann. Ich vermute, es gibt etwas Einfaches, das hier an der Wurzel ist, aber nachdem ich mehrere Tage verbracht habe, kann ich es nicht herausfinden! Die Verwendung des IAM-Checkers im AWS-Portal gibt alle "grünen Checks" für Cognito-Funktionen zurück, so dass ich sicher bin, dass dies auch kein Berechtigungsproblem auf der Serverseite ist.

Nochmals vielen Dank für Ihre Einsichten!

Edit: Vor dem Stück Code oben, rufe ich:

let credentialsProvider = self.initializeCognito() 

, die läuft (Identität Pool ID spielte out):

func initializeCognito() -> AWSCognitoCredentialsProvider 
{ 
    let credentialsProvider = AWSCognitoCredentialsProvider(
     regionType: AWSRegionType.USEast1, identityPoolId: "******") 

    let defaultServiceConfiguration = AWSServiceConfiguration(
     region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider) 

    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration 

    return credentialsProvider  
} 

Antwort

0

Ended up Die Antwort herausfinden - als ich AWS zum ersten Mal eingerichtet habe und einige der Handbücher von Amazon befolgt habe, habe ich Code in den App-Delegaten der Anwendung geschrieben, um einen neuen credentialsProvider zu erstellen. Ich habe es vergessen und versuchte später, einen anderen credentialsProvider zu initialisieren. Diese Verwirrung verursachte die Probleme und das Entfernen der Initialisierung in App Delegate behob die Authentifizierungsprobleme.

0

Diese Ausnahme geworfen werden kann, wenn du bist Es wird versucht, Anmeldeinformationen für eine authentifizierte ID zu erhalten, ohne dass ein Anbieter-Token damit verknüpft ist. Cognito erfordert mindestens eine Angabe.

Können Sie überprüfen, ob Sie das Facebook-Token während des GetCredentialsForIdentity-Aufrufs, der fehlschlägt, einbeziehen? Wenn nicht, würde ich vermuten, dass das dein Problem ist.

Edit:

Da Sie AWSCognito.defaultCognito() verwenden, könnte es helfen, das Beispiel auf this docs page um sicherzustellen, dass das Sync-Client verwendet die richtigen Anbieter von Anmeldeinformationen zu folgen:

let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider) 

AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration 
+0

Danke für die Antwort! In der vierten Codezeile, wie oben gezeigt, übergebe ich das Facebook Token an den cognito credentials provider - ist das nicht ausreichend? Wenn ich fragen könnte, was hätte ich schreiben sollen? Vielen Dank! – kmypwn

+0

Das hängt ein bisschen. Schlägt es sofort fehl, nachdem Sie sich angemeldet haben? Oder schließen Sie die App und warten ein wenig? Wenn Ersteres, initialisierst du den Sync-Client mit diesem Credentials-Provider? –

+0

Nach der Anmeldung bei Facebook (die erfolgreich ist), wird dieser Code sofort aufgerufen. cognitoID gibt "korrekt" zurück, d. h., wenn ich print (cognitoID) habe, um sicher zu gehen, dass ich nicht null oder etwas unsinniges bekomme, wird ein eindeutiger Identifikator (gleich dem, den ich den AWS Cognito Identity Browser finde) korrekt gedruckt. Ich hatte den CredentialsProvider auskommentiert.refresh() -Zeile, aber das Einfügen von nur gibt einen anderen Fehler ähnlich dem bereits für die .Synchronise() - Zeile zur Verfügung gestellt. Kurz gesagt, nein, es gibt kein Ende/Wiedereröffnung! – kmypwn

Verwandte Themen