2016-05-27 9 views
1

Ich verwende Xcode (Swift). Ich habe versucht, Code zu schreiben, der sich anmeldet, Benutzer bestätigt und Benutzer in den Benutzerpool einloggt. Nach erfolgreicher Anmeldung möchte ich, dass es mit Amazon Cognito Identity verknüpft wird. Im Grunde möchte ich eine so viele Identität Id wie viele Benutzer im Benutzerpool haben.Integrieren von Congnito User Pools mit Amazon Cognito Identity

Bis jetzt kann ich mich anmelden, Benutzer bestätigen und anmelden (mit expliziten Login). Bei der erfolgreichen Anmeldung versuche ich, diesen Benutzer mit Cognito Identity Pool zu verknüpfen, damit für diesen Benutzer eine eindeutige ID generiert werden kann.

Wenn ich mich derzeit als anderer Benutzer bei der Anwendung anmelde, wird ihm die gleiche Identitätskennung zugewiesen wie dem vorherigen Benutzer. Mit anderen Worten: Unabhängig davon, wie viele Benutzer in meinem Benutzerpool vorhanden sind, habe ich auf der Seite AWS Cogntio Federated Identity Pool nur eine Identitäts-ID. Im Idealfall sollte es eine separate Identitäts-ID für verschiedene Benutzer erstellt haben.

Unten ist der Code in App Delegate innerhalb der Funktion didFinishLaunchingWithOptions.

let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: nil) 
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = serviceConfiguration 
let configurationUserPool = AWSCognitoIdentityUserPoolConfiguration.init(clientId: "####", clientSecret: "####", poolId: "####") 
AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithConfiguration(serviceConfiguration, userPoolConfiguration: configurationUserPool, forKey: "testPool") 
self.userPool = AWSCognitoIdentityUserPool(forKey: "testPool") 

Unten ist der Code in Sign View Controller.

@IBAction func signIn(sender: AnyObject) { 

    let user = self.userPool.getUser(userName.text!) 

    user.getSession(userName.text!, password: password.text!, validationData: nil, scopes: nil).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: { 
     (task:AWSTask!) -> AnyObject! in 

     if task.error != nil { 
      print(task.error) 
     } else { 
      print("Successful Login") 

      let cp = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: "######", identityProviderManager:self.userPool) 
      let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: cp) 

      AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration     
      cp.getIdentityId().continueWithBlock { (task: AWSTask!) -> AnyObject! in 

       if (task.error != nil) { 
        print("Error: ") 

       } else { 
        // the task result will contain the identity id 
        print("Success with id") 
        print(task.result) 
       } 
       return nil 
      } 

      dispatch_async(dispatch_get_main_queue()){ 
       // do stuff here ... 
      } 
     } 
     return nil 
    }) 
} 

Antwort

1

Endlich konnte ich dieses Problem beheben. Das Problem war, dass ich jedes Mal, wenn ich einen neuen Benutzer anmeldete, den Anmeldeinformationsanbieter zurücksetzte. Als ich es zum App-Delegierten verschoben habe, hat es so funktioniert, wie es sollte.

Dies sollte nicht in SignIn-Funktion sein, sondern es sollte App Delegate sein.

let cp = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: "######", identityProviderManager:self.userPool) 
let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: cp) 
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration     

Richtiger Weg.

let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: nil) 
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = serviceConfiguration 
let configurationUserPool = AWSCognitoIdentityUserPoolConfiguration.init(clientId: "####", clientSecret: "####", poolId: "####") 
AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithConfiguration(serviceConfiguration, userPoolConfiguration: configurationUserPool, forKey: "testPool") 
self.userPool = AWSCognitoIdentityUserPool(forKey: "testPool") 
self.cp = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: "######", identityProviderManager:self.userPool) 
let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: self.cp) 
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration     
+0

Können Sie bitte eine Referenz oder Dokumentation, die Sie verwendet haben, um dies zu erstellen. Es gibt viele Tutorials für Benutzerpools, die in Ziel c verfügbar sind, aber es ist sehr schwierig, eine Swift-Referenz zu finden. –

+0

Ich habe das im Wesentlichen implementiert, aber ich finde immer noch, dass alle Benutzer noch im selben Identity-Pool speichern. Alle anderen Lösungen, die ich gesehen habe, erwähnen einen benutzerdefinierten Identity-Provider. – RickR

Verwandte Themen