AWS Cognito iOS。注销后未经身份验证的错误

时间:2017-02-10 16:34:47

标签: ios amazon-web-services amazon-cognito aws-sdk-ios aws-cognito

我使用AWS Cognito,通过MobileHub与iOS应用集成,通过Facebook登录。 一切正常,直到我退出现有身份并尝试使用另一个FB帐户登录(或者甚至使用相同的帐户) 在这种情况下,每当我调用任何AWS Lambda时,我都会收到此错误:

AWSiOSSDK v2.4.9 [错误] AWSCredentialsProvider.m行:577。
[AWSCognitoCredentialsProvider凭证]。
无法刷新。错误是[错误域= com.amazonaws.AWSCognitoIdentityErrorDomain Code = 8"(null)" UserInfo = {__ type = NotAuthorizedException,message =此身份池不支持未经身份验证的访问。}]

但是,如果我终止并重新启动应用程序,一切正常。

此错误源自here

从阅读AWS SDK代码我看,它发生是因为认知身份不能从凭据提供者here获取登录:

我想这是预期的,因为我已经退出了。但问题是即使登录到FB AWS后仍然认为我未经授权。从我在StackOverflow上的类似问题看,过去人们手动在AWSCognitoCredentialsProvider上设置了登录字典。但现在这个属性已被弃用,其他类似的属性也是只读的。

以下是我在AppDelegate中的AWS设置didFinishLaunchingWithOptions方法:

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
}

请注意,我尝试清除钥匙串而不是这样做。结果是一样的。

我真的很感激任何帮助! 最好的祝福, 亚历

1 个答案:

答案 0 :(得分:0)

您是否在执行登录方法时执行此操作?

- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    FBSDKAccessToken* fbToken = [FBSDKAccessToken currentAccessToken];
    if(fbToken){
        NSString *token = fbToken.tokenString;
        return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : token }];
    }else{
            return [AWSTask taskWithError:[NSError errorWithDomain:@"Facebook Login"
                                                          code:-1
                                                      userInfo:@{@"error":@"No current Facebook access token"}]];
    }
}

More details