2

我有一个正在开发的 iOS 应用程序,并且我正在使用 AWS Cognito 来管理用户身份验证。我正在使用预制的登录界面。但是,当在 AWS 控制台中创建用户时,会为该用户分配一个临时密码,用户需要在首次登录时更改该密码。这由“用户和组”部分中的状态“FORCE_CHANGE_PASSWORD”指示AWS 控制台中的用户池详细信息。

当管理员创建的用户首次尝试登录时,会出现“NEW_PASSWORD_REQUIRED”质询。由于预制的登录工作流程显然无法处理该挑战,因此我学会了如何检测它何时发生,并打开一个新的视图控制器,该控制器将接受用户名、当前密码和新密码。为了检测挑战,我编辑了挑战发生时调用的库函数,并通过 NotificationCenter 传递了一个通知。我意识到编辑库文件可能不是最佳实践,但这是我可以开始工作的唯一方法,以便我的代码知道何时发生挑战。

视图控制器尝试使用 更改用户密码user.changePassword(OLD_PASSWORD, proposedPassword: NEW_PASSWORD)。但这实际上并没有更改密码。在.continueWith{ (response) -> Any? in回调内部,我发现response如下<AWSTask: 0x7fd417e6ca90; completed = YES; cancelled = NO; faulted = YES; result = (null)>

我在任何地方都找不到这个问题的答案。我已经搜索了 AWS 文档(找到了一个解决方案,但适用于 android:https ://docs.aws.amazon.com/cognito/latest/developerguide/using-amazon-cognito-user-identity-pools-android-sdk-authenticate- admin-created-user.html)以及堆栈溢出、GitHub 和一般网络上的此处,但我还没有找到任何可行的解决方案。我意识到这个问题:在 AWS iOS SDK 中,我如何处理 FORCE_CHANGE_PASSWORD 用户状态似乎是同一个问题,并且得到了回答。不幸的是,我无法让我的代码使用该答案。以下是当用户点击按钮更改密码时调用的函数,并在文本字段中输入提供的信息:

@IBAction func submitNewPassword(_ sender:AnyObject) {
    print("Attempting to submit new password...")
    let pool: AWSCognitoIdentityUserPool = AWSCognitoIdentityUserPool(forKey: userPoolID)
    let user: AWSCognitoIdentityUser = pool.getUser(usernameInput.text!)
    user.changePassword(oldPasswordInput.text!, proposedPassword: newPasswordInput.text!).continueWith { (response) -> Any? in
        print("\n\nResponse is: \(response)\n\n")
    }
}

我一直试图弄清楚如何承担不同的角色并以这种方式更改密码,认为这可能是一个授权问题,但我无法弄清楚如何做到这一点。任何帮助将不胜感激!这绝对是我遇到过的最令人沮丧的错误!

4

0 回答 0