【发布时间】:2017-02-28 07:43:45
【问题描述】:
这是我们在应用中实现用户帐户的场景
- 用户会自动获得一个匿名的访客帐户
- 用户将个人资料数据保存到他们的访客帐户中
- 要从其他设备访问他们的访客帐户,用户必须注册并将他们的访客帐户转换为注册用户帐户
- 用户从另一台设备登录,获得对其注册用户帐户的访问权限,并可以访问他们之前保存的个人资料数据
我们不会强迫用户完成第 3 步和第 4 步。只要他们不需要切换设备或将设备恢复出厂设置,他们就不会失去对其访客帐户的访问权限。
使用 Amazon Mobile SDK 2.3.x 和 Cognito 联合身份池,我们实现了上述步骤:
- 使用 Cognito 联合身份池创建未经身份验证的身份
- 使用 Cognito Data Sync 保存配置文件数据
- 使用 Facebook 作为登录提供程序,将 Facebook 登录链接到未经身份验证的身份,从而将其转换为注册身份
- 在另一台设备上使用 Facebook 登录,这会从之前的设备切换到已注册的身份。用户有权访问保存在 Cognito Data Sync 中的以前的个人资料数据
为了实施这些步骤,我们使用了在引入 Cognito 用户池之前由 AWS Mobile Hub 生成的示例代码。它结合了 AWSIdentityManager 和 AWSFacebookSignInProvider 以及它们的支持代码。一切都按预期进行。
我们现在正在尝试转换为最新的 Amazon Mobile SDK 2.4.9 并使用 Cognito 用户池而不是 Facebook 登录来实现相同的流程:
- 同上
- 同上
- 用户使用 Cognito 用户池进行注册以创建用户池身份。使用用户名/密码登录。
- 用户在另一台设备上使用用户名/密码登录,以切换到注册的用户池身份。用户现在应该可以访问保存在 Cognito Data Sync 中的个人资料数据。
第 1 步和第 2 步是使用来自 AWSMobileHubHelper.framework 的 AWSIdentityManager 实现的;步骤 #3 和 #4 使用来自 CognitoYourUserPoolsSample 示例项目的示例代码实现。
我们遇到的问题是:
- 在第 3 步中,注册会在用户池控制台中创建 Cognito 用户池身份。但是使用该注册用户登录不会将登录从用户池身份链接到身份池身份。
- 在之前的实施中,身份提供者“graph.facebook.com”在身份池控制台中被列为链接登录。身份提供者“cognito-idp.us-east-1.amazonaws.com/us-east-1_123456789”应该有类似的东西,如Integrating User Pools with Amazon Cognito Identity中所述。
- 在第 4 步中,使用已注册用户池身份的用户名/密码登录后,身份池身份永远不会切换到之前设备上的已注册身份。 (可能是由于上面的问题)。因此,无法访问先前保存的配置文件数据。
- 在 Facebook 实现中,前面的示例代码为我们完成了这项工作,并按照Switching Identities 中的描述通知了应用程序。在用户池实现中,通知永远不会到来。
我在这里遗漏了一个非常重要的步骤。我怀疑我没有明确地将 Cognito 用户池登录名链接到 Cognito 身份池身份。在他们的 CognitoYourUserPoolsSample 中,他们没有给出如何将用户池身份与联合身份池集成的示例。
文档说只需这样做,它是自动的,但我无法让它工作:
AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:@"UserPool"];
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc]
initWithRegionType:AWSRegionUSEast1
identityPoolId:@“<identity-pool-id>"
identityProviderManager:pool];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
有人有任何想法或示例代码来演示该过程吗?我能找到的最接近的示例代码是 fork of CognitoSyncDemo,但它仍然不是我所需要的。
【问题讨论】: