如何将Cognito用户池与Cognito联合身份池集成

时间:2016-10-18 21:23:21

标签: ios amazon-web-services

以下是我们在应用中实施用户帐户的方案

  1. 自动为用户提供匿名访客帐户
  2. 用户将个人资料数据保存到其访客帐户
  3. 要从其他设备访问其来宾帐户,用户必须注册并将其来宾帐户转换为注册用户帐户
  4. 用户从其他设备登录,可以访问其注册用户帐户,并可以访问以前保存的个人资料数据
  5. 我们不强迫用户完成步骤#3和#4。只要他们不需要切换设备或出厂重置他们的设备,他们就不会失去对访客帐户的访问权限。

    使用亚马逊移动SDK 2.3.x和Cognito联合身份池,我们实施了上述步骤:

    1. 使用Cognito联合身份池创建未经身份验证的身份
    2. 使用Cognito Data Sync保存配置文件数据
    3. 使用Facebook作为登录提供商,将Facebook登录链接到未经身份验证的身份,从而将其转换为注册身份
    4. 使用Facebook从其他设备登录,该设备从之前的设备切换到注册的身份。用户可以访问Cognito Data Sync
    5. 中保存的先前配置文件数据

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

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

      1. 与上述相同
      2. 与上述相同
      3. 用户使用Cognito用户池注册以创建用户池标识。使用用户名/密码登录。
      4. 用户使用其他设备上的用户名/密码登录以切换到已注册的用户池标识。用户现在应该可以访问Cognito Data Sync中保存的配置文件数据。
      5. 步骤#1& #2使用来自AWSMobileHubHelper.framework的AWSIdentityManager实现;步骤#3& #4使用CognitoYourUserPoolsSample示例项目中的示例代码实现。

        我们遇到的问题是:

        1. 在步骤3中,注册会在用户池控制台中创建Cognito用户池标识。但是,使用该注册用户登录时,不会将登录从用户池标识链接到标识池标识。
          • 在之前的实现中,身份提供程序“graph.facebook.com”在Identity Pool控制台中列为链接登录。身份提供者“cognito-idp.us-east-1.amazonaws.com/us-east-1_123456789”应该有类似的内容,如Integrating User Pools with Amazon Cognito Identity中所述。
        2. 在步骤#4中,使用已注册的用户池标识的用户名/密码登录后,标识池标识永远不会切换到先前设备上的已注册的标识。 (可能是由于上面的问题)。因此,无法访问先前保存的配置文件数据。
          • 在Facebook实施中,前面的示例代码为我们做了这个,并按照Switching Identities中的描述通知了应用程序。在用户池实现中,通知永远不会出现。
        3. 我在这里缺少一个非常重要的步骤。我怀疑我没有明确地将Cognito用户池登录链接到Cognito Identity Pool标识。在他们的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,它仍然不是我需要的。

1 个答案:

答案 0 :(得分:6)

凭据提供程序支持标识的合并,但AWSIdentityManager(mobile-hub-helper的一部分)不支持。我有一个修改后的mobile-hub-helper版本(它是https://github.com/BruceBuckland/aws-mobilehub-helper-ios上的mobile-hub-helper github的一个分支)。该分支修改AWSIdentityManager以支持以下几项:1)它支持编写新的AWSSignInProviders(移动中心辅助协议)并使用它们来恢复会话。 2)它支持&#34;允许合并身份&#34;和身份的融合。 3)它有几个辅助方法来查找哪个提供程序正在进行当前的身份验证以及提供程序的友好名称,这对于向用户显示链接的内容很有用,并显示哪个提供程序拒绝登录。

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

最后,我建议您查看示例应用中的pdf说明。它们可以帮助您更好地理解组件的相互作用。我花了很长时间才了解cognito,并将我的笔记拉到一起,试图为其他人澄清系统。他们在这里:Cognito Notes and Diagram