2016-01-05 65 views
3

我很高兴地使用Cognito Sync和我的预发布应用程序(iOS/Objective-C),并使用Facebook登录。但是,在提交Apple App Store评论时,我被要求删除Facebook登录。我认为这将很简单 - 只需将非真实角色策略更改为与auth用户匹配,并绕过任何与Facebook身份验证相关的操作。AWS Cognito身份更改为匿名/访客用户

但是,现在我发现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不会跨会话等发生变化?有人可以阐明为什么这会改变吗?我已经确认我没有清除代码中任何地方的钥匙串。

+0

如果有帮助:前几个条目具有“us-east-1:c5263844-7229-4e48-a203-f4c547871339”作为identityId,并且随后的条目具有“us-east-1:86a69d0f-bb28-4acd- a229-9821d18e56ba“作为身份标识。我检查了Cognito身份浏览器,并且第一个值不存在。 – LNI

+0

我刚刚升级到2.3.3,并在日志中看到一条新消息:“[AWSCognitoDataset synchronizeInternal:] |冲突重试耗尽”。这是否指向潜在的原因? – LNI

回答

1

的为别人可能碰到这样的情况:

测试手机(包括iOS和Android )当我使用Facebook登录时,我改变了使用unauth的策略。记住这一点非常重要(在我看来,没有很好的记录),从非认证到认证登录是一条单向的街道 - 你无法从认证的用户转到未认证的用户,而无需重新设置ID。所以我遇到的问题似乎是独特的(我试图从auth到unauth)。

+0

那么从auth到unauth的解决方案是什么?用户可以注销并再次登录! – Bernard

+0

@Bernard - 我试过了,至少对于我使用的版本,设备没有“换手” - 即ID没有重置为新用户。 AWS现在可能已经修复了它,最近还没有对它进行测试。您是否尝试过注销并最近登录,并获得了正确的ID? – LNI

+0

是的,我认为AWS也修复了它。此外,我犯了一个错误,并定义了两次AWSCognitoCredentialsProvider。 – Bernard

1

当使用AWSCognitoCredentialsProvider时,身份标识被本地缓存,并将在实例化提供程序时被重新使用。

可能的解决方案: (1)要获得身份ID用 “credentialsProvider.identityId”,而不是 “getIdentityId” (2)确保你不叫clearCredentials或clearKeyChain关闭应用程序时

评论: 使用unauth没有问题,但是如果用户删除他们的应用程序或从另一个设备登录,则无法再次获取相同的身份(因为它们未经身份验证)。如果您需要用户能够跨设备访问相同的数据/应用安装,您将需要某种形式的认证

+0

谢谢马克!这也是我的理解。我确认我没有在我的代码中的任何地方调用clearCredentials或clearKeyChain。为什么要分配两个不同的ID?你有可能看看两个ID(我在上面的原始问题的评论中注明了它们),看看这是否能让你对原因有所了解? credentialsProvider.identityId和[self.credentialsProvider getIdentityId]之间是否有区别?他们不会映射到相同的方法调用吗?我了解与unauth有关的风险,将在更高版本中实施身份验证身份支持。 – LNI

+0

嗨,感谢您检查您不要调用clearKeyChain和clearCredentials。目前还不清楚为什么只有在使用未经身份验证的情况下才能获得两个不同的ID,因为这些ID在此缓存:https://github.com/aws/aws-sdk-ios/blob/master/AWSCore/Authentication/AWSCredentialsProvider.m#L351 ....这么几个问题:(1)这已被多次转载? (2)如果您调用credentialsProvider.identityId(而不是getIdentityId),它是否返回nil(表示缓存中没有任何内容)? –

+0

1)始终发生。以下是我刚刚运行它的日志:2016-01-07 11:12:58.567 Scotch Aficionado [30819:4828008]得到身份证号为us-east-1:f90736c9-d663-4fc3-9740-1b3c16b0d949 2016 -01-07 11:12:58.567 Scotch Aficionado [30819:4828008] Old = us-east-1:32ed3260-140d-4249-b98d-933cd63e11fa,New = us-east-1:f90736c9-d663-4fc3-9740- 1b3c16b0d949,保持旧2)我会检查是否credentialsProvider.identityId没有改变。 – LNI

相关问题