我很高兴将Cognito Sync与我的预发布应用程序(iOS / Objective-C)结合使用,并通过Facebook登录。但是,提交Apple App Store审查后,我被要求删除Facebook登录。我认为这很简单-只是更改了unauth角色策略以匹配auth用户,并绕过了与Facebook身份验证有关的任何事情。
但是,现在我发现identityId在会话之间正在更改。它的行为类似于会话ID。这是一个很头疼的问题,因为我的应用程序使用identityId作为DynamoDB中的哈希键。因此,例如,DynamoDB搜索当前用户的近期 Activity ,仅显示当前会话的历史记录,而不显示预期的所有历史记录。
我正在使用示例应用程序的代码来获取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时,身份标识在本地缓存,将在提供程序实例化时检索以重新使用。
可能的解决方案:
(1)要获取身份ID,请使用“credentialsProvider.identityId”而不是“getIdentityId”
(2)确保关闭应用程序时未调用clearCredentials或clearKeyChain
注释:
使用unauth很好,但是,如果用户删除其应用程序或从其他设备登录,则无法再次获得相同的身份(因为它们未经身份验证)。如果您需要用户能够跨设备/应用安装访问相同的数据,则需要某种身份验证
关于ios - 匿名/ guest 用户的AWS Cognito identityId更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34620614/