Ich melde meine Benutzer mit der E-Mail- und Kennwortmethode von Firebase an. so was:
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser signed = task.getResult().getUser();
writeNewUser(signed.getUid());
new Android.os.Handler().postDelayed(
new Runnable() {
public void run() {
updateUser(b);
}
}, 3000);
} else {
new Android.os.Handler().postDelayed(
new Runnable() {
public void run() {
onSignupFailed();
}
}, 3000);
}
}
});
Nachdem die E-Mail des Benutzers erfolgreich registriert wurde, möchte ich, dass Firebase eine Bestätigungs-E-Mail sendet. Ich weiß, dass dies mit Firebases sendEmailVerification
möglich ist. Zusätzlich zum Senden dieser E-Mail möchte ich, dass das Konto des Benutzers deaktiviert wird, bis die E-Mail bestätigt wird. Dies würde auch die Verwendung der Firebase-Funktion isEmailVerified
erfordern. Ich habe es jedoch nicht geschafft, Firebase zum Versenden der Bestätigungs-E-Mail zu bewegen. Ich konnte nicht herausfinden, ob es das Konto deaktiviert, das die Bestätigungs-E-Mail sendet, und nachdem es bestätigt wurde.
In dieser Frage wird beschrieben, wie Firebase zum Senden der Bestätigungs-E-Mail verwendet wird. Das OP kann nicht herausfinden, wie das Konto deaktiviert und aktiviert werden kann, das die Bestätigungs-E-Mail sendet und nachdem diese bestätigt wurde.
Dies ist auch in der Firebase-Dokumentation nicht ordnungsgemäß dokumentiert. Ich schreibe also ein schrittweises Verfahren, dem jemand folgen kann, wenn er/sie das Problem hat.
1) Der Benutzer kann die createUserWithEmailAndPassword-Methode verwenden.
Beispiel:
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("TAG", "createUserWithEmail:onComplete:" + task.isSuccessful());
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
// Show the message task.getException()
}
else
{
// successfully account created
// now the AuthStateListener runs the onAuthStateChanged callback
}
// ...
}
});
Wenn das neue Konto erstellt wurde, ist der Benutzer ebenfalls angemeldet und der AuthStateListener führt den onAuthStateChanged-Callback aus. Im Rückruf können Sie das Senden der Bestätigungs-E-Mail an den Benutzer verwalten.
Beispiel:
onCreate(...//
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
// NOTE: this Activity should get onpen only when the user is not signed in, otherwise
// the user will receive another verification email.
sendVerificationEmail();
} else {
// User is signed out
}
// ...
}
};
Jetzt kann die Sende-Bestätigungs-E-Mail folgendermaßen geschrieben werden:
private void sendVerificationEmail()
{
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
user.sendEmailVerification()
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
// email sent
// after email is sent just logout the user and finish this activity
FirebaseAuth.getInstance().signOut();
startActivity(new Intent(SignupActivity.this, LoginActivity.class));
finish();
}
else
{
// email not sent, so display message and restart the activity or do whatever you wish to do
//restart this activity
overridePendingTransition(0, 0);
finish();
overridePendingTransition(0, 0);
startActivity(getIntent());
}
}
});
}
Jetzt zu LoginActivity kommen:
Wenn der Benutzer erfolgreich angemeldet ist, können Sie hier einfach eine Methode aufrufen, in der Sie Logik schreiben, um zu prüfen, ob die E-Mail bestätigt wurde oder nicht.
Beispiel:
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
//Log.d("TAG", "signInWithEmail:onComplete:" + task.isSuccessful());
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
//Log.w("TAG", "signInWithEmail:failed", task.getException());
} else {
checkIfEmailVerified();
}
// ...
}
});
Betrachten Sie nun die checkIfEmailVerified-Methode:
private void checkIfEmailVerified()
{
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user.isEmailVerified())
{
// user is verified, so you can finish this activity or send user to activity which you want.
finish();
Toast.makeText(LoginActivity.this, "Successfully logged in", Toast.LENGTH_SHORT).show();
}
else
{
// email is not verified, so just Prompt the message to the user and restart this activity.
// NOTE: don't forget to log out the user.
FirebaseAuth.getInstance().signOut();
//restart this activity
}
}
Hier überprüfe ich also, ob die E-Mail bestätigt wurde oder nicht. Wenn nicht, dann melden Sie den Benutzer ab.
Dies war mein Ansatz, die Dinge richtig zu verfolgen.
Verwenden Sie FirebaseAuth.getInstance().getCurrentUser().sendEmailVerification()
und FirebaseAuth.getInstance().getCurrentUser().isEmailVerified()
Es gibt keine Möglichkeit, das Konto über das Firebase SDK zu deaktivieren. Sie können die GetTokenResult
verwenden, die das Firebase-Authentifizierungs-ID-Token enthält, und es gegen Ihr benutzerdefiniertes Backend validieren oder ein Flag für die diesem Benutzer entsprechende Firebase-Datenbank setzen. Persönlich würde ich mit der Flagge in der Firebase-Datenbank gehen
bestätigung an die E-Mail des Benutzers senden
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
user.sendEmailVerification();
Überprüfen Sie, ob der Benutzer verifiziert ist
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
boolean emailVerified = user.isEmailVerified();
Um E-Mail-Links mit Firebase zu senden, müssen Sie zunächst die FirebaseAuth-Instanz Mit der Instanz, die wir Benutzer auf Firebase erstellen, aufrufen:
firebaseauth.createUserWithEmailAndPassword(email,pass);
Wenn die Methode erfolgreich zurückgegeben wird, senden wir den Bestätigungslink mithilfe der Firebase-Benutzerinstanz wie folgt an den Benutzer:
final FirebaseUser user = mAuth.getCurrentUser();
user.sendEmailVerification()
Siehe diesen Link: https://technicalguidee.000webhostapp.com/2018/10/email-verification-through-link-using-firebase-authentication-product-Android .