因此,我有一个非常简单的“忘记密码”系统设置。似乎工作正常。
private void resetUser(final String email){
mAuth.sendPasswordResetEmail(email) .addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "Email sent.");
Toast.makeText(ForgotActivity.this, "Confirmation Email Sent", Toast.LENGTH_SHORT).show();
}
}
});
}
问题是,更改此密码后,我还需要从Firebase获取新密码,因为我的登录方案同时使用Firebase和应用服务器。因此,如果他们在Firebase上更改了密码,并且该密码尚未发送到应用服务器的数据库中,那么他们将无法登录。
因此,我需要某种方法来将新密码重置后自动发送回应用程序。
这可能吗?
答案 0 :(得分:0)
好吧……这真的再简单不过了:
首先,我们将我的原始代码添加到最后,然后将其发送回品牌NewLoginActivity:
private void resetUser(final String email){
mAuth.sendPasswordResetEmail(email) .addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "Email sent.");
Toast.makeText(ForgotActivity.this, "Confirmation Email Sent", Toast.LENGTH_SHORT).show();
Toast.makeText(ForgotActivity.this, "Enter New Password", Toast.LENGTH_LONG).show();
Intent intent = new Intent(
ForgotActivity.this,
NewLoginActivity.class);
startActivity(intent);
finish();
}
}
});
}
在NewLoginActivity中,FirebaseAuth验证新的电子邮件和密码组合,然后将其发送以更新密码:
private void loginUser( final String email, final String password) {
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "signInWithEmail:success");
FirebaseUser user = mAuth.getCurrentUser();
updatePassword(email, password);
updateUI(user);
} else {
Log.w(TAG, "signInWithEmail:failure", task.getException());
Toast.makeText(NewLoginActivity.this, "mAuth sign-in failed.",
Toast.LENGTH_SHORT).show();
updateUI(null);
}
}
});
}
此新登录活动与旧登录活动完全相同,不同之处在于,当用户输入电子邮件地址和新密码时...新密码现在保存到数据库中,并且只能从ForgotPassword活动中访问此NewLoginActivity :
private void updatePassword(final String email, final String pass){
Log.d(TAG, "Password Updated Line 359");
String cancel_req_tag = "newpass";
StringRequest strReq = new StringRequest(Request.Method.POST,
URL_FOR_UPDATE, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Update Pass Response: " + response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "Update Pass Resp Error: Shit " + error.getMessage());
}
}) {
@Override
protected Map<String, String> getParams () {
Map<String, String> params = new HashMap<String, String>();
params.put("email", email);
params.put("pass", pass);
return params;
}
};
AppSingleton.getInstance(getApplicationContext()).addToRequestQueue(strReq, cancel_req_tag);
Log.d(TAG, "Pass Request: " + strReq);
Toast.makeText(NewLoginActivity.this, "Password Updated", Toast.LENGTH_SHORT).show();
}
Et VOILA!因此,用户重设密码...被发送到firebase输入新密码...在执行此操作时,该应用程序使用外观相同但全新的登录名。他们输入他们的电子邮件地址和密码,现在新密码将保存到Firebase和应用程序数据库中,并且用户已登录。像馅饼一样简单!
我想唯一的问题是用户是否在输入新密码之前关闭了应用程序...但是您可以创建一个SavedPreference甚至修改先前的意图,然后使用它发送原始登录名来更新密码。因此,...不仅可以获得新的Firebase密码,而且还有更多的选择权。