2016-09-16 31 views
0

在iOS SDK(v2.4.8)中,我無法註銷用戶,然後以其他用戶身份正確登錄。如何強制AWS Cognito從服務器檢索IdentityId?

的(正確的)cognityIdentityId由AWS針對第一用戶(因爲一個應用程序開始)返回也被返回給所述第二用戶(除非該應用被重新啓動)。這使得另一個用戶可以訪問一個用戶的AWSCognitoDataset。

我想這是因爲iOS SDK中已經緩存的ID和記錄呼叫清除緩存,並不能完全工作。

登錄時:

// one-off initialisation 

self.credentialsProvider = AWSCognitoCredentialsProvider(regionType:AWSRegionType.USEast1,identityPoolId:Constants.CognitoIdentityPoolId) 設配置= AWSServiceConfiguration(區域:AWSRegionType.USEast1,credentialsProvider:self.credentialsProvider ) AWSServiceManager.defaultServiceManager()。defaultServiceConfiguration = configuration ... //我從我的外部提供者serice(Auth0)獲得idToken func doAmazonLogin(idToken:String,success:() - >(),_ failure:(N SError) - >()){ 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一會又需要每一個新用戶,以登錄到每個時間設定logins時間打電話setIdentityProviderManagerOnce

回答

0

你能描述一下你的登錄/註銷流程嗎? Cognito不支持來自同一提供商的每個身份的多個登錄,所以聽起來像,除非您使用多個登錄,否則實際上並沒有改變身份。

在任何情況下,你有沒有嘗試過的憑據提供的clearKeyChain方法?這主要是用於這樣的用例 - 清除所有內容。

+0

我已經添加代碼段我問:我要實現的是允許被註銷的賬戶。然後如果一個不同的用戶帳戶登錄,以獲得不同的cognitoIdentityId。即我不希望第二個帳戶被第一個帳戶合併或污染。目前,應用程序需要在「註銷」後重新啓動,重新啓動後,登錄過程得到正確的cognitoIdentityId。沒有重新啓動,第二次登錄獲取第一個帳戶的認證身份Id – Carl

+0

它看起來像你使用身份驗證身份,設置登錄。這在登錄時應該總是給你相同的ID。重啓的情況下是不是在請求中設置一個令牌,但是非重啓是? –

+0

我只是建議,因爲clearKeyChain是要註銷的方式。它會對所有的東西進行覈對 –