Как отменить вызов ParseUser.setPassword()?
Я разрешаю пользователю изменять свои учетные данные.
Он вводит новое имя пользователя, адрес электронной почты и пароль, и я люблю:
ParseUser user = ParseUser.getCurrentUser();
user.setUsername("MY NEW NAME");
user.setEmail(email);
user.setPassword("MY NEW PW");
user.saveInBackground(...);
И что? Таким образом, вызов save()
может завершиться неудачно, по большому числу причин (например: имя пользователя, уже принятое кем-то другим). Я могу сказать, что в этом случае ни одно из указанных выше полей не обновляется, что справедливо: я показываю ошибку, пользователь знает, что все пошло не так.
Все становится сложнее, если вы заметите, что даже после ParseException
, user
выше хранит свои грязные поля, которые не могут быть сохранены на сервере. То есть.
//saveInBackground fails
//...
user.getUsername().equals("MY NEW NAME") // true!
Проблема
Теперь я могу вернуть эти поля к правильным значениям, вызвав user.fetch()
, но это не работает с полем password
.
Это особенно нежелательно, потому что любой будущий вызов save()
или такой (который может не сработать, потому что, возможно, это совершенно другой звонок) также обновит пароль! То есть.
//later
ParseUser user = ParseUser.getCurrentUser();
user.put("stuff");
user.save();
Это не только поместит "материал", но также изменит пароль на "МОЙ НОВЫЙ PW" .. без ведома пользователя.
Есть ли способ reset локального поля password
, кроме fetch()
, который не работает? Я знаю, что могу сохранить имя пользователя, адрес электронной почты и пароль с тремя различными запросами, но это не возможное решение для моего дела.
Ответы
Ответ 1
Глядя на новейший выпуск, который я прочитал в журнале изменений:
V1.10.2 - 15 СЕНТЯБРЯ 2015 г.
Новое: добавлен ParseObject.revert() и вернется (ключ), чтобы разрешить возврат грязные изменения
Похоже, это может быть так. Это определенно необходимо.
Ответ 2
Обходной путь может использовать
+ becomeInBackground:
в классе PFUser (с PFUser.currentUser(). sessionToken как токен), когда сбой не удался, но это все еще является риском для getInBackground.
Это могло бы по крайней мере предотвратить некоторые случаи, чтобы произойти , если makeInBackground эффективно отменяет setPassword и принимает текущий sessionToken как параметр, я не тестировал, что
Ответ 3
Если бы это была моя проблема, я попытался бы сначала создать oldUser и сохранить все текущие данные, тогда при сбое, пришло время изменить каждую вещь до нормального значения, или если удастся пора убить oldUser, Надеюсь, это поможет.
Ответ 4
Обычный текст пароля не сохраняется в Parse и поэтому он не может быть получен приложением. Найдено здесь https://www.parse.com/questions/get-current-users-password-to-compare-it-with-a-string
Если вы хотите сменить пароль, вы можете использовать ParseUser.requestPasswordResetInBackground()
, чтобы изменить пароль с помощью электронной почты.
Но если вам нужно очень тяжело получить пароль, вы можете сохранить его в SharedPreferences
после входа в систему.
Ответ 5
После некоторого теста и проверки, вот некоторые выводы.
- В синтаксическом анализе "пароль" является полем special, вы не можете получить к нему доступ с помощью ParseUser. Это способ ParseUser имеет setPassword(), но не имеет метода getPassword()
- Даже при обратном управлении [Core] - [Data] - [User] вы можете увидеть поле "пароль" Скрыто
- Вот почему метод fetch() не может восстановить исходное значение "пароль"
Итак, я думаю, что если вы хотите реализовать выше, вам нужно, попробуйте этот путь
// First time register //
ParseUser user = ParseUser.getCurrentUser();
user.setUsername("MY NAME");
user.setEmail(email);
user.setPassword("MY PW");
user.put("_password", "MY PW");
// The key can't use "password", this reserve key word in Parse //
user.saveInBackground(...);
// Next time update //
user.setUsername("MY NEW NAME");
user.setPassword("MY NEW PW");
user.saveInBackground(...);
// if have something exception //
user.fetch();
// user.setPassword(user.get("_password"));
user.save();
ParseUser.login("MY NAME", "MY PW"); // Error
ParseUser.login("MY NAME", "MY NEW PW"); // Ok
user.fetch();
user.setPassword(user.get("_password"));
user.save();
ParseUser.login("MY NAME", "MY PW"); // OK