【问题标题】:In AWS iOS SDK, how do I handle FORCE_CHANGE_PASSWORD User Status在 AWS iOS SDK 中,我如何处理 FORCE_CHANGE_PASSWORD 用户状态
【发布时间】:2017-08-03 12:34:44
【问题描述】:

我已经按照这里的示例进行了操作

https://github.com/awslabs/aws-sdk-ios-samples/tree/master/CognitoYourUserPools-Sample

将交互式 cognito 登录集成到我的 iOS 应用程序中。这一切都很好,但是当在池中创建新用户时,他们最初具有 FORCE_CHANGE_PASSWORD 状态。

对于安卓,您可以按照以下步骤操作

http://docs.aws.amazon.com/cognito/latest/developerguide/using-amazon-cognito-user-identity-pools-android-sdk-authenticate-admin-created-user.html

但对于 iOS,我不知道如何做到这一点。使用该示例,如果我尝试使用处于 FORCE_CHANGE_PASSWORD 状态的用户登录,我会在控制台日志中看到以下输出(为简洁起见,删除了一些值):

{"ChallengeName":"NEW_PASSWORD_REQUIRED","ChallengeParameters":{"requiredAttributes":"[]","userAttributes":"{\"email_verified\":\"true\",\"custom:autoconfirm\ ":\"Y\","Session":"xyz"}

以下是上述示例中 SignInViewController 的代码。

import Foundation
import AWSCognitoIdentityProvider

class SignInViewController: UIViewController {
    @IBOutlet weak var username: UITextField!
    @IBOutlet weak var password: UITextField!
    var passwordAuthenticationCompletion: AWSTaskCompletionSource<AWSCognitoIdentityPasswordAuthenticationDetails>?
    var usernameText: String?

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.password.text = nil
        self.username.text = usernameText
        self.navigationController?.setNavigationBarHidden(true,   animated: false)
    }

    @IBAction func signInPressed(_ sender: AnyObject) {
        if (self.username.text != nil && self.password.text != nil) {
            let authDetails = AWSCognitoIdentityPasswordAuthenticationDetails(username: self.username.text!, password: self.password.text! )
            self.passwordAuthenticationCompletion?.set(result: authDetails)
        } else {
            let alertController = UIAlertController(title: "Missing information",
                                                message: "Please enter a valid user name and password",
                                                preferredStyle: .alert)
            let retryAction = UIAlertAction(title: "Retry", style: .default, handler: nil)
            alertController.addAction(retryAction)
        }
    }
}

extension SignInViewController: AWSCognitoIdentityPasswordAuthentication {

    public func getDetails(_ authenticationInput: AWSCognitoIdentityPasswordAuthenticationInput, passwordAuthenticationCompletionSource: AWSTaskCompletionSource<AWSCognitoIdentityPasswordAuthenticationDetails>)     {
        self.passwordAuthenticationCompletion = passwordAuthenticationCompletionSource
        DispatchQueue.main.async {
            if (self.usernameText == nil) {
                self.usernameText = authenticationInput.lastKnownUsername
            }
        }
    }

    public func didCompleteStepWithError(_ error: Error?) {
        DispatchQueue.main.async {
        if let error = error as? NSError {
            let alertController = UIAlertController(title: error.userInfo["__type"] as? String,
                                                    message: error.userInfo["message"] as? String,
                                                    preferredStyle: .alert)
            let retryAction = UIAlertAction(title: "Retry", style: .default, handler: nil)
            alertController.addAction(retryAction)

            self.present(alertController, animated: true, completion:  nil)
            } else {
                self.username.text = nil
                self.dismiss(animated: true, completion: nil)
            }
        }
    }
}

didCompleteStepWithError 执行时,error 为空,我希望它表明某些信息告诉我们用户需要更改密码。

我的问题实际上是如何捕获输出到控制台的"ChallengeName":"NEW_PASSWORD_REQUIRED" json?

【问题讨论】:

    标签: ios aws-sdk aws-cognito


    【解决方案1】:

    现在排序。把它贴在这里以防它帮助其他人。

    首先,您需要创建一个允许用户指定新密码的视图控制器。 ViewController 应该有一个AWSTaskCompletionSource&lt;AWSCognitoIdentityNewPasswordRequiredDetails&gt; 作为属性:

    var newPasswordCompletion: AWSTaskCompletionSource<AWSCognitoIdentityNewPasswordRequiredDetails>?
    

    按照问题中提到的示例中的模式,然后我将AWSCognitoIdentityNewPasswordRequired 实现为视图控制器的扩展,如下所示:

    extension NewPasswordRequiredViewController: AWSCognitoIdentityNewPasswordRequired {
        func getNewPasswordDetails(_ newPasswordRequiredInput: AWSCognitoIdentityNewPasswordRequiredInput, newPasswordRequiredCompletionSource:
        AWSTaskCompletionSource<AWSCognitoIdentityNewPasswordRequiredDetails>) {                    
            self.newPasswordCompletion = newPasswordRequiredCompletionSource
        }
    
        func didCompleteNewPasswordStepWithError(_ error: Error?) {
            if let error = error as? NSError {
                // Handle error
            } else {
                // Handle success, in my case simply dismiss the view controller
                self.dismiss(animated: true, completion: nil)
            }
        }
    
    }
    

    再次按照问题中详述的示例设计,向 AppDelegate 的 AWSCognitoIdentityInteractiveAuthenticationDelegate 扩展添加一个函数:

    extension AppDelegate: AWSCognitoIdentityInteractiveAuthenticationDelegate {
        func startPasswordAuthentication() -> AWSCognitoIdentityPasswordAuthentication {
            //Existing implementation
        }
        func startNewPasswordRequired() -> AWSCognitoIdentityNewPasswordRequired {
            // Your code to handle how the NewPasswordRequiredViewController is created / presented, the view controller should be returned
            return self.newPasswordRequiredViewController!
        }
    }
    

    【讨论】:

    • 感谢您提供详细信息。我无法想象与 Cognito 相关的文档对用户如此不友好。他们提供的api也很差
    【解决方案2】:

    在 Cognito 控制台中创建用户时实现 ResetPassword 的完美示例。

    但是,将此 ResetPassword 机制集成到您现有的应用程序是您的责任。

    https://github.com/davidtucker/CognitoSampleApplication/tree/article1/CognitoApplication

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多