【问题标题】:How to integrate Cognito User Pools with Cognito Federated Identity Pools如何将 Cognito 用户池与 Cognito 联合身份池集成
【发布时间】:2017-02-28 07:43:45
【问题描述】:

这是我们在应用中实现用户帐户的场景

  1. 用户会自动获得一个匿名的访客帐户
  2. 用户将个人资料数据保存到他们的访客帐户中
  3. 要从其他设备访问他们的访客帐户,用户必须注册并将他们的访客帐户转换为注册用户帐户
  4. 用户从另一台设备登录,获得对其注册用户帐户的访问权限,并可以访问他们之前保存的个人资料数据

我们不会强迫用户完成第 3 步和第 4 步。只要他们不需要切换设备或将设备恢复出厂设置,他们就不会失去对其访客帐户的访问权限。

使用 Amazon Mobile SDK 2.3.x 和 Cognito 联合身份池,我们实现了上述步骤:

  1. 使用 Cognito 联合身份池创建未经身份验证的身份
  2. 使用 Cognito Data Sync 保存配置文件数据
  3. 使用 Facebook 作为登录提供程序,将 Facebook 登录链接到未经身份验证的身份,从而将其转换为注册身份
  4. 在另一台设备上使用 Facebook 登录,这会从之前的设备切换到已注册的身份。用户有权访问保存在 Cognito Data Sync 中的以前的个人资料数据

为了实施这些步骤,我们使用了在引入 Cognito 用户池之前由 AWS Mobile Hub 生成的示例代码。它结合了 AWSIdentityManager 和 AWSFacebookSignInProvider 以及它们的支持代码。一切都按预期进行。

我们现在正在尝试转换为最新的 Amazon Mobile SDK 2.4.9 并使用 Cognito 用户池而不是 Facebook 登录来实现相同的流程:

  1. 同上
  2. 同上
  3. 用户使用 Cognito 用户池进行注册以创建用户池身份。使用用户名/密码登录。
  4. 用户在另一台设备上使用用户名/密码登录,以切换到注册的用户池身份。用户现在应该可以访问保存在 Cognito Data Sync 中的个人资料数据。

第 1 步和第 2 步是使用来自 AWSMobileHubHelper.framework 的 AWSIdentityManager 实现的;步骤 #3 和 #4 使用来自 CognitoYourUserPoolsSample 示例项目的示例代码实现。

我们遇到的问题是:

  1. 在第 3 步中,注册会在用户池控制台中创建 Cognito 用户池身份。但是使用该注册用户登录不会将登录从用户池身份链接到身份池身份。
    • 在之前的实施中,身份提供者“graph.facebook.com”在身份池控制台中被列为链接登录。身份提供者“cognito-idp.us-east-1.amazonaws.com/us-east-1_123456789”应该有类似的东西,如Integrating User Pools with Amazon Cognito Identity中所述。
  2. 在第 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,但它仍然不是我所需要的。

【问题讨论】:

    标签: ios amazon-web-services


    【解决方案1】:

    凭证提供商支持身份合并,但 AWSIdentityManager(mobile-hub-helper 的一部分)不支持。我有一个 mobile-hub-helper 的修改版本(它是 mobile-hub-helper github https://github.com/BruceBuckland/aws-mobilehub-helper-ios 的一个分支)。该分支修改了 AWSIdentityManager 以支持几件事:1) 它支持编写新的 AWSSignInProviders(一个移动集线器助手协议)并使用它们来恢复会话。 2)它支持“允许合并身份”和身份合并。 3) 它有几个帮助方法来查找当前正在执行身份验证的提供者以及提供者的友好名称,这对于向用户显示链接的内容以及显示哪个提供者拒绝登录等很有用。

    还有一个示例应用程序,其中包括一个用于 Cognito 用户池的 AWSSignInProvider 的快速实现。它演示了三个提供商(UserPools FaceBook 和 Google)的登录注销和帐户链接。它实现了用户池的多种功能,包括注册、登录、忘记密码、更新属性以及确认这些功能。它位于https://github.com/BruceBuckland/SignIn-awsmhh

    最后,我建议您查看示例应用程序中的笔记 pdf。它们可以帮助您更好地理解组件之间的交互。我花了很长时间才理解 cognito,我整理笔记试图为其他人澄清系统。他们在这里:Cognito Notes and Diagram

    【讨论】:

    • 非常感谢。这个解决方案(您的 Mobile Hub Helper 的分支)解决了我们的问题。在您的“Cognito 注释和图表”PDF 中对 Cognito 进行了非常彻底和简洁的总结。
    猜你喜欢
    • 1970-01-01
    • 2016-09-26
    • 2018-11-07
    • 2018-02-11
    • 1970-01-01
    • 2017-02-10
    • 2017-04-08
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多