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



我很高兴在我的预发布应用程序(iOS/Objective-C)中使用Cognito Sync,并登录Facebook。然而,在提交苹果应用商店审查时,我被要求删除Facebook登录。我认为这会很简单——只是更改了未经授权的角色策略以匹配身份验证用户,并绕过了与Facebook身份验证有关的任何内容。

然而,现在我发现identityId在会话之间发生了变化。它的行为就像一个会话ID。这是一个令人头疼的问题,因为我的应用程序在DynamoDB中使用identityId作为哈希键。因此,例如,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不会在会话等之间发生更改?有人能解释为什么这种情况会改变吗?我已经确认,我不会清除代码中任何位置的钥匙链。

使用AWSCognitoCredentialsProvider时,identityid会缓存在本地,并将在实例化提供程序时检索以供重用。

可能的解决方案:(1) 要获取标识id,请使用"credentialsProvider.identityId"而不是"getIdentityId"(2) 关闭应用程序时,请确保您没有调用clearCredentials或clearKeyChain

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

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

测试手机(iOS和Android)都使用Facebook登录,当时我将策略改为使用Unath。重要的是要记住(在我看来,没有很好的记录),从未经身份验证登录到身份验证登录是一条单行道——如果不重置ID,就无法从经过身份验证的用户到未经身份认证的用户。因此,我遇到的问题似乎是我的情况所特有的(试图从auth到unath)。

相关内容

  • 没有找到相关文章

最新更新