我正在使用 AWS Cognito,通过 MobileHub 与 iOS 应用程序集成以通过 Facebook 登录。一切正常,直到我注销现有身份并尝试使用另一个 FB 帐户(甚至相同)登录。
在这种情况下,每次调用任何 AWS Lambda 时都会出现此错误:
AWSiOSSDK v2.4.9 [错误] AWSCredentialsProvider.m 行:577。
[AWSCognitoCredentialsProvider 凭证]。
无法刷新。错误是 [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=8 "(null)" UserInfo={__type=NotAuthorizedException, message=此身份池不支持未经身份验证的访问。}]
但是,如果我终止并重新启动应用程序,一切都会再次正常运行。
此错误源自此处:
通过阅读 AWS SDK 代码,我看到这是因为 cognito 身份没有从这里的凭证提供者那里获得登录信息:
我想这是意料之中的,因为我已经注销了。但问题是即使在登录 FB AWS 后仍然认为我未经授权。从 StackOverflow 上的类似问题我看到,过去人们在 AWSCognitoCredentialsProvider 上手动设置登录字典。但现在这个属性已被弃用,其他类似的属性是只读的。
这是我在 AppDelegate didFinishLaunchingWithOptions 方法中的 AWS 设置:
let cred = AWSCognitoCredentialsProvider(regionType: .euWest1, identityPoolId: "POOLID")
let config = AWSServiceConfiguration(region: .euWest1, credentialsProvider: cred)
AWSServiceManager.default().defaultServiceConfiguration = config
if let config = config {
config.timeoutIntervalForRequest = 30
config.timeoutIntervalForResource = 30
config.maxRetryCount = 3
AWSLambdaInvoker.register(with: config, forKey: "key")
}
let mapperConfiguration = AWSDynamoDBObjectMapperConfiguration()
mapperConfiguration.saveBehavior = .updateSkipNullAttributes
AWSDynamoDBObjectMapper.register(with: config!, objectMapperConfiguration: mapperConfiguration, forKey: "updateObjectMapper")
这是注销代码:
AWSIdentityManager.defaultIdentityManager().logout { (result, error) in
if let cp = AWSServiceManager.default().defaultServiceConfiguration.credentialsProvider as? AWSCognitoCredentialsProvider {
cp.clearKeychain()
}
// Open login screen
}
请注意,我尝试了清除钥匙串并没有这样做。结果是一样的。
我真的很感激任何帮助!
最好的问候,亚历克斯