2017-05-20 2 views
0

Ich verwende FirebaseUI-auth in meiner App, um Benutzer mit E-Mail und Facebook anmelden.Wie kann ich E-Mails verifizieren, ohne sich bei der Verwendung von FirebaseUI-auth erneut anmelden zu müssen?

Wenn sich ein Benutzer per E-Mail anmeldet, wird er zu einem Bildschirm geführt, auf dem ein Text angezeigt wird, der ihn auffordert, seine E-Mail zu bestätigen.

Hier ist mein Code:

continue_button.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        startActivityForResult(
          // Get an instance of AuthUI based on the default app 
          AuthUI.getInstance() 
            .createSignInIntentBuilder() 
            .setProviders(Arrays.asList(new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(), 
              new AuthUI.IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build())) 
            .setIsSmartLockEnabled(!BuildConfig.DEBUG) 
            .build(), 
          RC_SIGN_IN); 
       } 
      }); 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     // RC_SIGN_IN is the request code you passed into startActivityForResult(...) when starting the sign in flow. 
     if (requestCode == RC_SIGN_IN) { 
      IdpResponse response = IdpResponse.fromResultIntent(data); 

      // Successfully signed in 
      if (resultCode == ResultCodes.OK) { 
       Intent intent = new Intent(SignUpActivity.this, MainActivity.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
       startActivity(intent); 
       return; 
      } else { 
       // Sign in failed 
       if (response == null) { 
        // User pressed back button 
        Toast.makeText(getBaseContext(), "Sign in cancelled", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       if (response.getErrorCode() == ErrorCodes.NO_NETWORK) { 
        Toast.makeText(getBaseContext(), "No internet", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       if (response.getErrorCode() == ErrorCodes.UNKNOWN_ERROR) { 
        Toast.makeText(getBaseContext(), "Unknown error", Toast.LENGTH_SHORT).show(); 
        return; 
       } 
      } 

      Toast.makeText(getBaseContext(), "Unknown sign in response", Toast.LENGTH_SHORT).show(); 
     } 
    } 

Als er auf den Bestätigungslink zu ihm klickt gesendet, wird seine E-Mail, aber jetzt überprüft, wenn er kommt zurück in die App oder wenn er die App schließen und wieder öffnet, wird der Bildschirm zeigt immer noch den Text zum Überprüfen der E-Mail an und wenn er sich nach der Überprüfung der E-Mail abmeldet und wieder anmeldet, darf nur er Zugriff auf die App haben.

Hier ist der Code, der bestimmt, ob E-Mail überprüft wird oder nicht:

if (auth.getCurrentUser() != null) { 
      if (auth.getCurrentUser().getProviders().contains("password")) { 

       boolean emailVerified = auth.getCurrentUser().isEmailVerified(); 

       if (emailVerified) { 

        Toast.makeText(getBaseContext(), "Email has been verified", Toast.LENGTH_SHORT).show(); 
        emailNotVerifiedTxt.setVisibility(View.INVISIBLE); 
        openEmailBtn.setVisibility(View.INVISIBLE); 

       } else { 

        emailNotVerifiedTxt.setVisibility(View.VISIBLE); 
        openEmailBtn.setVisibility(View.VISIBLE); 
        auth.getCurrentUser().sendEmailVerification() 
          .addOnCompleteListener(new OnCompleteListener<Void>() { 
           @Override 
           public void onComplete(@NonNull Task<Void> task) { 
            if (task.isSuccessful()) { 
             Snackbar snackbar = Snackbar 
               .make(coordinatorLayout, "An email verification link has been sent to " + auth.getCurrentUser().getEmail(), Snackbar.LENGTH_LONG); 
             snackbar.show(); 
            } 
           } 
          }); 

       } 
      } 
     } 

Hier onResume():

@Override 
    protected void onResume() { 
     super.onResume(); 

     if (auth != null) { 
      if (auth.getCurrentUser() != null) { 
       auth.getCurrentUser().reload(); 
      } 
     } 

    } 

Was ich wissen will, ist, wie kann ich dem Anwender vollen Zugriff auf die App geben ohne dass er sich abmeldet und wieder anmeldet, sobald seine E-Mail-Adresse verifiziert ist?

Bitte lassen Sie es mich wissen.

Antwort

1

Der Aufruf von reload() auf dem currentUser sollte den Status isEmailVerified() aktualisieren. Eine Sache, die Sie tun können, ist, wenn die App fortgesetzt wird, den Benutzer neu zu laden(), überprüfen, ob verifiziert ist, wenn nicht, den Benutzer bitten, sein Konto zu verifizieren, andernfalls den Benutzer die App weiter verwenden zu lassen. Auf diese Weise muss sich der Benutzer nicht jedes Mal neu anmelden.

+0

siehe den Code, den ich in 'onResume()' in der aktualisierten Frage hinzugefügt habe. Es funktioniert immer noch nicht. –

+1

Das Reload muss nicht unbedingt den Listener onAuthStateChanged auslösen. Nachdem Sie neu geladen haben, müssen Sie überprüfen, ob der Benutzer verifiziert ist oder nicht, und dann die E-Mail bei Bedarf senden. – bojeil

Verwandte Themen