如何强制AWS Cognito从服务器检索IdentityId?

时间:2016-09-16 15:25:44

标签: amazon-cognito

在iOS SDK(v2.4.8)中,我无法注销用户,然后以其他用户身份正确登录。

AWS为第一个用户(因为应用程序启动)返回的(正确的)cognityIdentityId也会返回给第二个用户(除非应用程序重新启动)。这样就可以访问另一个用户的AWSCognitoDataset。

我认为这是因为iOS SDK缓存了id并且记录了调用以清除缓存,并不能完全发挥作用。

登录时:

// one-off initialisation

self.credentialsProvider = AWSCognitoCredentialsProvider(regionType:AWSRegionType.USEast1,identityPoolId:Constants.CognitoIdentityPoolId)         let configuration = AWSServiceConfiguration(region:AWSRegionType.USEast1,credentialsProvider:self.credentialsProvider)         AWSServiceManager.defaultServiceManager()。defaultServiceConfiguration = configuration     ...     //我从外部提供商serice(Auth0)获得idToken     func doAmazonLogin(idToken:String,success :() - >(),_ failure:(NSError) - >()){         var task:AWSTask?

    //Initialize clients for new idToken
    if self.credentialsProvider?.identityProvider.identityProviderManager == nil || idToken != Application.sharedInstance.retrieveIdToken() {
        let logins = [Constants.CognitoIDPUrl: idToken]
        task = self.initializeClients(logins)
    } else {
        //Use existing clients
        self.credentialsProvider?.invalidateCachedTemporaryCredentials()
        task = self.credentialsProvider?.getIdentityId()
    }
    //Make login
    task!.continueWithBlock { (task: AWSTask!) -> AnyObject! in
        if (task.error != nil) {
            failure(task.error!)
        } else {
            // the task result will contain the identity id
            let cognitoId:String? = task.result as? String
            self.customIdentityProviderManager!.addToken(Constants.CognitoIDPUrl, value:idToken)
            //Store Cognito token in keychain
            Application.sharedInstance.storeCognitoToken(cognitoId)
            success()
        }
        return nil
    }
}

func initializeClients(logins: [NSObject:AnyObject]?) -> AWSTask? {
    //Create identity provider managet with logins
    let manager = CustomIdentityProviderManager(tokens: logins!)
    self.credentialsProvider?.setIdentityProviderManagerOnce(manager)        
    return self.credentialsProvider?.getIdentityId()
}

退出时:

// Clear ALL saved values for this provider (identityId, credentials, logins). [docs][1]
let keychain = A0SimpleKeychain(service:"…")
keychain.clearAll()

我也尝试过添加:

credentialsProvider!.clearCredentials()
credentialsProvider!.clearKeychain()

是否有人使用AWS iOS SDK并成功编码注销,以便新用户可以干净地登录?

有一个奇怪命名的方法credentialsProvider.setIdentityProviderManagerOnce() - 我找不到这个记录,但它的名字暗示它应该只在每个会话被调用一次。但是,如果keychain.clearAll()删除logins,则每次新用户登录时都需要调用setIdentityProviderManagerOnce,以便每次都设置logins

1 个答案:

答案 0 :(得分:0)

您能描述一下您的登录/退出流程吗? Cognito不支持每个身份来自同一提供商的多次登录,因此听起来,除非您使用多个登录,否则它实际上并未改变身份。

在任何情况下,您是否在凭据提供程序上尝试了clearKeyChain方法?它主要用于这样的用例 - 清除所有内容。