Сброс пароля не проверяется для существующих пользователей - PullRequest
0 голосов
/ 22 марта 2019

В моей функции сброса пароля пользователь может добавить все, что захочет. Это даже не должен быть адрес электронной почты.

Я хотел бы проверить действительный адрес электронной почты и чтобы он был зарегистрирован на Parse Server

@IBAction func forgotPasswordButtonTapped(_ sender: Any) {

let forgotPasswordAlert = UIAlertController(title: "Forgot password?", message: "Please enter your email address", preferredStyle: .alert)
forgotPasswordAlert.view.tintColor = UIColor.red
forgotPasswordAlert.addTextField { (textField) in
    textField.placeholder = "Email address"
}
forgotPasswordAlert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
forgotPasswordAlert.addAction(UIAlertAction(title: "Reset password", style: .default, handler: { (action) in
    let resetEmail = forgotPasswordAlert.textFields?.first?.text
    PFUser.requestPasswordResetForEmail(inBackground: resetEmail!, block: { (success, error) in
        if error != nil {
            let resetFailedAlert = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .alert)
            resetFailedAlert.view.tintColor = UIColor.red
            resetFailedAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(resetFailedAlert, animated: true, completion: nil)
        } else {
            let resetEmailSentAlert = UIAlertController(title: "Password reset instructions sendt", message: "Please check your email", preferredStyle: .alert)
            resetEmailSentAlert.view.tintColor = UIColor.red
            resetEmailSentAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(resetEmailSentAlert, animated: true, completion: nil)
        }
    })

}))
//PRESENT ALERT
self.present(forgotPasswordAlert, animated: true, completion: nil)

}

Ответы [ 3 ]

2 голосов
/ 22 марта 2019

В вашем действии вы можете проверить действительность электронной почты: -

forgotPasswordAlert.addAction(UIAlertAction(title: "Reset password", style: .default, handler: { (action) in
    let resetEmail = forgotPasswordAlert.textFields?.first?.text
if self.isValidEmail(testStr: resetEmail) {
// Check of email registered on server should be done via this API and API should return error based on that.
    PFUser.requestPasswordResetForEmail(inBackground: resetEmail!, block: { (success, error) in
        if error != nil {
            let resetFailedAlert = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .alert)
            resetFailedAlert.view.tintColor = UIColor.red
            resetFailedAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(resetFailedAlert, animated: true, completion: nil)
        } else {
            let resetEmailSentAlert = UIAlertController(title: "Password reset instructions sendt", message: "Please check your email", preferredStyle: .alert)
            resetEmailSentAlert.view.tintColor = UIColor.red
            resetEmailSentAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(resetEmailSentAlert, animated: true, completion: nil)
        }
    })
} else {
//Show error that email entered is not correct format
// present the reset email alertbox again.
}

}))

func isValidEmail(testStr:String) -> Bool {        
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

    let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailTest.evaluate(with: testStr)
}
0 голосов
/ 24 марта 2019

В связи с тем, что Parse Server не уведомляет клиента о том, что пользователь с указанным адресом электронной почты не существует:

До 3.1.0 Parse Server запрос на сброс пароля возвратил ошибку, если адрес электронной почтыоднако не было обнаружено, что это представляет угрозу безопасности, поскольку позволяет злоумышленнику получить пользовательские данные для использования в атаке методом перебора - см. объяснение .

. Вы также можете посмотреть на changelog и PR, который реализовал это изменение .

Можно было бы реализовать это самостоятельно, выполнив запрос к классу User перед выполнением запроса сброса пароля.Однако этого не следует делать в клиентском коде, так как это потребует публичной доступности пользовательских данных, что является серьезным нарушением конфиденциальности.Он также может быть реализован в облачном коде с использованием мастер-ключа, чтобы пользовательские данные могли оставаться недоступными для общественности, но это представляло бы такую ​​же угрозу безопасности, о которой говорилось выше.

0 голосов
/ 22 марта 2019

Для проверки электронной почты имеется адаптер разбора электронной почты.

Verifying user email addresses and enabling password reset via email requires an email adapter. As part of the parse-server package we provide an adapter for sending email through Mailgun. To use it, sign up for Mailgun, and add this to your initialization code:

https://github.com/parse-community/parse-server

...