AWS Cognito 错误:未设置身份验证委托

Posted

技术标签:

【中文标题】AWS Cognito 错误:未设置身份验证委托【英文标题】:AWS Cognito error: Authentication delegate not set 【发布时间】:2016-10-06 14:41:14 【问题描述】:

我正在使用 XCode 7.3 在 Swift 中开发 ios 应用程序。该应用程序与 DynamoDB 数据库通信,允许用户读取和写入数据。最近,我更新了我的 pod,其中包括 AWSDynamoDBAWSCognitoAWSCognitoIdentityProvider 和其他 AWS pod。我还按照这个页面上的说明设置了一个新的用户池:

http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-integrating-user-pools-with-identity-pools.html

作为遵循这些说明的一部分,我将以下代码放入 AppDelegate 类的 didFinishLaunchingWithOptions 方法中:

let serviceConfiguration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: nil)
    let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId:APP_CLIENT_ID, clientSecret: appSecret, poolId: USER_POOL_ID)
    AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithConfiguration(serviceConfiguration, userPoolConfiguration: userPoolConfiguration, forKey: USER_POOL_NAME)
    let pool = AWSCognitoIdentityUserPool(forKey:USER_POOL_NAME)
    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: IDENTITY_POOL_ID, identityProviderManager:pool)
    let configuration = AWSServiceConfiguration(region:.USEast1, credentialsProvider:credentialsProvider)
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration

我通过从 AWS 控制台导航到 Cognito、Federated Identities、我按照说明创建的身份池“编辑身份池”,然后复制“身份”旁边显示的字符串,获得了 IDENTITY_POOL_ID 的值池 ID”。通过在同一页面上展开“身份验证提供程序”并选择“Cognito”选项卡,我获得了 APP_CLIENT_ID 的值。对于USER_POOL_NAME,我使用了此页面上的“身份池名称”,对于USER_POOL_ID,我使用了“身份验证提供程序”下列出的“用户池ID”值。我不清楚我是否正确设置了这些值,因为我不完全确定开发人员指南说我应该使用哪些值。

更新 pod 并进行这些更改后,当我运行应用程序时,我看到了错误:

[Error] AWSCredentialsProvider.m line:569 | __44-[AWSCognitoCredentialsProvider credentials]_block_invoke.345 | Unable to refresh. Error is [Error Domain=com.amazonaws.AWSCognitoIdentityProviderErrorDomain Code=-1000 "Authentication delegate not set" UserInfo=NSLocalizedDescription=Authentication delegate not set]

现在也无法访问 DynamoDB 数据,尽管该应用程序仍在启动。我怀疑部分问题是我的 DynamoDB 数据库不在 USEast,但我不确定这是否真的会导致此错误。除了更改 AppDelegate 中的代码外,我还尝试查找此错误的可能原因,但错误仍然相同。我可以调查哪些可能的原因?如果它有所作为,除了恢复 DynamoDB 功能之外,我还尝试允许该应用授权用户,并且我希望在解决此问题的过程中同时完成这两项工作。

【问题讨论】:

【参考方案1】:

看起来您在尝试让用户注册或登录时遇到了问题。在您的示例代码中,您没有设置 pool.delegate 值。此行应该在您的 AppDelegate 中

pool.delegate = self

这也应该实现 AWSCognitoIdentityInteractiveAuthenticationDelegate

这篇博文应该可以帮助您入门: https://mobile.awsblog.com/post/TxGNH1AUKDRZDH/Announcing-Your-User-Pools-in-Amazon-Cognito

示例应用程序也可能会有所帮助 https://github.com/awslabs/aws-sdk-ios-samples/blob/75ada5b6283b7c04c1214b2e1e0a6394377e3f2b/CognitoYourUserPools-Sample/Objective-C/CognitoYourUserPoolsSample/AppDelegate.h

【讨论】:

谢谢,这些链接很有帮助。但是,现在我已经设置了登录/注册屏幕,当我输入我的信息并尝试注册我的应用程序时出现一个新错误:“__type”:“ResourceNotFoundException”,“message”:“用户池客户端#### 不存在。” 这与我用于 APP_CLIENT_ID 的值相同,我从“身份验证提供程序”下的“应用程序客户端 ID”字段中复制了它,但它没有出现在其他任何地方。这是否应该与我在用户池或联合身份池中看到的其他值匹配?创建池时我应该从哪里获得这个值? 没关系,我更仔细地查看了用户池控制台并找到了我正在寻找的值。

以上是关于AWS Cognito 错误:未设置身份验证委托的主要内容,如果未能解决你的问题,请参考以下文章

Android 应用程序中的 AWS Amplify Cognito 身份验证错误

用于 Django3 + DRF 身份验证的 AWS Cognito

将 AWS Cognito 添加到 Angular 应用程序

CloudFormation AWS::Cognito::IdentityPoolRoleAttachment RoleMappings 语法错误

使用 AWS cognito 进行匿名身份验证

使用 AWS Cognito 进行多租户身份验证