在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
。
答案 0 :(得分:0)
您能描述一下您的登录/退出流程吗? Cognito不支持每个身份来自同一提供商的多次登录,因此听起来,除非您使用多个登录,否则它实际上并未改变身份。
在任何情况下,您是否在凭据提供程序上尝试了clearKeyChain方法?它主要用于这样的用例 - 清除所有内容。