AWS Cognito identityId更改为匿名/访客用户

时间:2016-01-05 20:26:16

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

我很高兴使用Cognito Sync和我的预发布应用程序(iOS / Objective-C),以及Facebook登录。但是,在提交Apple App Store审核后,我被要求删除Facebook登录信息。我认为这很简单 - 只需更改unauth角色策略以匹配auth用户并绕过与Facebook身份验证相关的任何内容。

但是,现在我发现identityId在会话之间发生了变化。它的行为类似于会话ID。这是一个令人头痛的问题,因为我的应用程序使用identityId作为DynamoDB中的哈希键。因此,例如,DynamoDB搜索当前用户的近期活动仅显示当前会话的历史记录,而不是按预期显示所有历史记录。

我正在使用示例应用程序的代码来获取identityId - 它似乎正在被正确分配。基于样本的AWSIdentityManager.m,以下是didFinishLaunchingWithOptions内AppDelegate.m的一部分:

AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AMAZON_COGNITO_REGION
                                                                                                identityPoolId:AMAZON_COGNITO_IDENTITY_POOL_ID];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AMAZON_COGNITO_REGION
                                                                     credentialsProvider:credentialsProvider];
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;

[[credentialsProvider getIdentityId] continueWithBlock:^id(AWSTask *task) {
    if (task.error) {
        NSLog(@"Error: Could not obtain identity id: %@", task.error);
    }
    else {
        // the task result will contain the identity id
        NSString *cognitoId = task.result;
        NSLog(@"Got the identity ID as %@", cognitoId);
        // Don't change the ID
        NSString *oldId = [[NSUserDefaults standardUserDefaults] objectForKey:NSUD_COGNITO_ID];
        if (!oldId) {
            [[NSUserDefaults standardUserDefaults] setObject:cognitoId forKey:NSUD_COGNITO_ID];
            [[NSUserDefaults standardUserDefaults] synchronize];
        } else {
            NSLog(@"Old = %@, New = %@, Keeping old", oldId, cognitoId);
        }
    }
    return nil;
}];

我不断收到新旧身份不一样的信息。此外,当我签入Cognito Sync时,无法再找到旧身份。

现在没有使用Facebook SignIn提供程序,如何确保identityId不会在会话等之间发生变化?有人可以说明为什么会发生变化吗?我已经确认我没有在代码中的任何地方清除钥匙串。

2 个答案:

答案 0 :(得分:1)

使用AWSCognitoCredentialsProvider时,身份ID在本地缓存,并将在提供程序的实例化时检索以供重复使用。

可能的解决方案: (1)要获取身份ID,请使用“credentialsProvider.identityId”而不是“getIdentityId” (2)确保在关闭应用程序时没有调用clearCredentials或clearKeyChain

评论: 使用unauth很好,但是如果用户删除他们的应用程序或从其他设备登录,则无法再次获得相同的身份(因为他们未经身份验证)。如果您需要用户能够跨设备/应用安装访问相同的数据,则需要进行某种身份验证

答案 1 :(得分:1)

对于可能遇到这种情况的其他人:

测试手机(iOS和Android)都使用Facebook登录,当我改变策略使用unauth时。重要的是要记住(在我看来并没有很好地记录)从unauth到auth登录是一条单行道 - 你不能在不重置ID的情况下从认证用户转到unauth。所以我遇到的问题似乎是我的情况所独有(试图从auth到unauth)。