anonymous/guest 用户的 AWS Cognito identityId 发生变化
AWS Cognito identityId changing for anonymous/guest users
我很高兴将 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 登录提供程序,我如何确保 identityId 不会跨会话等发生变化?有人可以阐明为什么会发生这种变化吗?我已经确认我没有在代码中的任何地方清除钥匙串。
使用 AWSCognitoCredentialsProvider 时,identityid 缓存在本地,并将在 re-use.
的提供程序实例化时检索
可能的解决方案:
(1) 要获取身份 ID,请使用 "credentialsProvider.identityId" 而不是 "getIdentityId"
(2) 确保在关闭应用程序时没有调用 clearCredentials 或 clearKeyChain
评论:
使用 unauth 很好,但是如果用户删除了他们的应用程序或从不同的设备登录,则无法再次获得相同的身份(因为他们未经身份验证)。如果您需要用户能够跨 device/app 安装访问相同的数据,您将需要某种身份验证
对于可能 运行 遇到这种情况的任何其他人:
当我将策略更改为使用 unauth 时,测试手机(iOS 和 Android)都在使用 Facebook 登录。重要的是要记住(在我看来,没有很好的记录)从 unauth 到 auth 登录是一条 one-way 街道 - 如果不重置 ID,你不能从经过身份验证的用户转到 unauth。所以我 运行 遇到的问题似乎是我的情况所独有的(尝试从 auth 到 unauth)。
我很高兴将 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 登录提供程序,我如何确保 identityId 不会跨会话等发生变化?有人可以阐明为什么会发生这种变化吗?我已经确认我没有在代码中的任何地方清除钥匙串。
使用 AWSCognitoCredentialsProvider 时,identityid 缓存在本地,并将在 re-use.
的提供程序实例化时检索可能的解决方案: (1) 要获取身份 ID,请使用 "credentialsProvider.identityId" 而不是 "getIdentityId" (2) 确保在关闭应用程序时没有调用 clearCredentials 或 clearKeyChain
评论: 使用 unauth 很好,但是如果用户删除了他们的应用程序或从不同的设备登录,则无法再次获得相同的身份(因为他们未经身份验证)。如果您需要用户能够跨 device/app 安装访问相同的数据,您将需要某种身份验证
对于可能 运行 遇到这种情况的任何其他人:
当我将策略更改为使用 unauth 时,测试手机(iOS 和 Android)都在使用 Facebook 登录。重要的是要记住(在我看来,没有很好的记录)从 unauth 到 auth 登录是一条 one-way 街道 - 如果不重置 ID,你不能从经过身份验证的用户转到 unauth。所以我 运行 遇到的问题似乎是我的情况所独有的(尝试从 auth 到 unauth)。