如何撤消ParseUser.setPassword()调用?

时间:2015-06-13 22:31:37

标签: android parse-platform

我让用户更改他的凭据。 他键入了新的用户名,电子邮件和密码,我想:

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();

这不仅仅会放置"东西",但也会将密码更改为" MY NEW PW" ..而用户不知道

有没有办法重置本地password字段,而fetch()以外的字段不起作用?我知道我可以通过三种不同的查询来保存用户名,电子邮件和密码,但这不是我案例的可能解决方案。

5 个答案:

答案 0 :(得分:1)

解决方法可以使用

+ becomeInBackground:
保存失败时,

在PFUser类上(使用PFUser.currentUser()。sessionToken作为标记),但仍然存在使getsInBackground失败的风险。 它至少可以防止某些情况发生如果,成为InBackground有效地取消了setPassword,并接受当前的sessionToken作为参数,我还没有测试过

答案 1 :(得分:1)

查看我在更新日志中读到的最新版本:

  

V1.10.2 - 2015年9月15日

     

新增:添加了ParseObject.revert()和revert(key)以允许还原   肮脏的变化

看起来可能就是这样。这绝对是必要的。

答案 2 :(得分:0)

如果是我的问题,我会首先尝试创建一个oldUser并将所有当前数据保存到它,然后当失败时,是时候将每个东西都改回正常值,或者如果成功则是时候杀死oldUser 。希望它可能有所帮助。

答案 3 :(得分:0)

密码纯文本未存储在Parse中,因此您的应用无法获取密码纯文本。在https://www.parse.com/questions/get-current-users-password-to-compare-it-with-a-string

找到它

如果您想更改密码,可以使用ParseUser.requestPasswordResetInBackground(),这样您就可以在电子邮件的帮助下更改密码。

但是如果你需要真的很难获得密码,你可以在登录后将其存储在SharedPreferences

答案 4 :(得分:0)

经过一些测试和检查,这里有一些结论。

  1. 在解析时,“密码”是特殊字段,您无法通过ParseUser访问它,这就是ParseUser具有setPassword()但没有getPassword()方法
  2. 的方式
  3. 即使在后台管理[核心] - [数据] - [用户],您也可以看到“密码”字段隐藏
  4. 这就是fetch()方法无法恢复原始“密码”值
  5. 的原因

    所以,我认为如果你需要上面的工具,请尝试这种方式

    // 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's 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