我想从实时数据库中的两个身份验证中更改电子邮件(当前用户)(用户的参考,以便他/她可以看到她的电子邮件)。我阅读了一些文档,但它需要密码,代码如下:
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
// Get auth credentials from the user for re-authentication
AuthCredential credential = EmailAuthProvider
.getCredential("user@example.com", "password1234"); // Current Login Credentials \\
// Prompt the user to re-provide their sign-in credentials
user.reauthenticate(credential)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Log.d(TAG, "User re-authenticated.");
//Now change your email address \\
//----------------Code for Changing Email Address----------\\
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
user.updateEmail("user@example.com")
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "User email address updated.");
}
}
});
//----------------------------------------------------------\\
}
});
无论如何,我如何获取 .getCredential 部分的密码,因为在电子邮件中我可以执行 user.getEmail() 但我不知道如何获取密码该帐户没有 user.getPassword() ; updatePassword 也是如此。我对如何做到这一点感到困惑。 顺便说一句,这是我的 updateEmail 和 updatePassowrd 代码。
编辑密码活动
saveEditProfile_studentbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseUser studentUserEmail = firebaseAuth.getCurrentUser();
String replaceUserMail = studentChangeMail.getText().toString().trim();
studentUserEmail.updateEmail(replaceUserMail).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
String studentUser = firebaseAuth.getCurrentUser().getUid();
final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users").child(studentUser);
String replaceName = studentChangeFullName.getText().toString().trim();
String replacePhoneNumber = studentChangePhoneNum.getText().toString().trim();
String replaceUserMail = studentChangeMail.getText().toString().trim();
Map<String, Object> updates = new HashMap<>();
updates.put("fullName", replaceName);
updates.put("phoneNumber", replacePhoneNumber);
updates.put("userEmail", replaceUserMail);
databaseReference.updateChildren(updates);
Toast.makeText(StudentProfileEditAct.this, "Changes has been made", Toast.LENGTH_SHORT).show();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(StudentProfileEditAct.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
});
编辑密码活动
changepassword_savechanges.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if ( changeNewPassword.getText().toString().equals(changeReEnterNewPassword.getText().toString())){
String newPassword = changeReEnterNewPassword.getText().toString().trim();
FirebaseUser studentUser = FirebaseAuth.getInstance().getCurrentUser();
studentUser.updatePassword(newPassword).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
Toast.makeText(StudentEditPasswordAct.this, "Re-authenticated, Password has been changed.", Toast.LENGTH_LONG).show();
startActivity(new Intent(getApplicationContext(), WelcomeStudentActivity.class));
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(StudentEditPasswordAct.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
else {
Toast.makeText(StudentEditPasswordAct.this, "Password does not match, please try again.", Toast.LENGTH_SHORT).show();
changeNewPassword.setText("");
changeReEnterNewPassword.setText("");
}
}
});
答案 0 :(得分:0)
要change the password of a user account,该用户必须最近登录 Firebase。如果该要求不存在,任何人都可以更改任何其他用户的密码,这将带来严重的安全风险。
因此,re-authenticating the user 文档中的逻辑是,当用户想要更改密码时,您要求用户再次输入其凭据,然后将这些凭据传递到 EmailAuthProvider.getCredential()
调用中。>