首页 文章

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

提问于
浏览
2

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

  • 将自动为用户提供匿名的来宾帐户

  • 用户将 Profiles 数据保存到其来宾帐户中

  • 为了从其他设备访问其访客帐户,用户必须注册并将其访客帐户转换为注册用户帐户

  • 用户从其他设备登录,获得对其注册用户帐户的访问权限,并可访问其先前保存的配置文件数据

我们不强迫用户完成步骤#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”在Identity Pool控制台中列为链接登录 . 对于身份提供者“cognito-idp.us-east-1.amazonaws.com/us-east-1_123456789”应该有类似的内容,如Integrating User Pools with Amazon Cognito Identity中所述 .

  • 在步骤#4中,使用已注册的用户池标识的用户名/密码登录后,标识池标识永远不会切换到先前设备上的已注册的标识 . (可能是由于上面的问题) . 因此,无法访问先前保存的配置文件数据 .

  • 在Facebook实现中,前面的示例代码为我们做了这个,并按照Switching Identities中的描述通知了应用程序 . 在用户池实现中,通知永远不会到来 .


我在这里缺少一个非常重要的步骤 . 我怀疑我没有明确地将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 回答

  • 6

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

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

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

相关问题