Подтвердить что ты не робот

Как отменить вызов 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(), который не работает? Я знаю, что могу сохранить имя пользователя, адрес электронной почты и пароль с тремя различными запросами, но это не возможное решение для моего дела.

4b9b3361

Ответ 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