1

我正在使用 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
}

请注意,我尝试了清除钥匙串并没有这样做。结果是一样的。

我真的很感激任何帮助!
最好的问候,亚历克斯

4

1 回答 1

0

你在 logins 方法的实现中这样做了吗?

- (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"}]];
    }
}

更多细节

于 2017-02-10T20:44:14.047 回答