Firebase Authentication更新密码:如何强制验证当前密码有效性?
解决Firebase Auth强制校验当前密码的问题
首先得明确你遇到问题的根源:Firebase Auth的reauthenticate()方法确实存在会话期内跳过凭证校验的设计——这是为了优化用户体验,避免短时间内重复要求输入密码。但这就导致了你碰到的情况:不管输入什么内容,都能触发密码更新操作。
解决方案:用signInWithCredential强制校验凭证
想要每次都严格验证当前输入的密码是否正确,你可以改用FirebaseAuth.signInWithCredential()方法,这个方法不受会话有效期影响,每次都会校验凭证的有效性。具体实现步骤如下:
- 像之前一样构建用户邮箱密码凭证
- 调用
signInWithCredential完成密码校验 - 校验成功后再执行密码更新操作
- 校验失败时,给用户反馈当前密码错误
修改后的代码示例:
FirebaseAuth mAuth = FirebaseAuth.getInstance(); FirebaseUser user = mAuth.getCurrentUser(); // 构建邮箱密码凭证 AuthCredential credential = EmailAuthProvider .getCredential(user.getEmail(), currentPass.getText().toString()); // 强制校验密码正确性 mAuth.signInWithCredential(credential) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // 密码校验通过,执行密码更新 user.updatePassword(newPass1.getText().toString()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { dialog.dismiss(); Toast.makeText(manageAccount.this, "Password updated!", Toast.LENGTH_LONG).show(); } else { // 处理密码更新失败场景,比如密码不符合复杂度要求 Toast.makeText(manageAccount.this, "Update failed: " + task.getException().getMessage(), Toast.LENGTH_LONG).show(); } } }); } else { // 密码校验失败,提示用户输入错误 dialog.dismiss(); Toast.makeText(manageAccount.this, "Current password is incorrect!", Toast.LENGTH_LONG).show(); } } });
补充提醒
- 你拒绝在客户端存储用户密码的做法非常正确,这确实是严重的安全风险,绝对不能这么做。
signInWithCredential校验通过后不会改变当前用户会话,只是完成了凭证验证,完全可以放心使用。
内容的提问来源于stack exchange,提问作者Ath now
相关产品推荐
相关产品推荐

