2016-10-05 23 views
9

Chcę zaimplementować funkcję zmiany hasła dla mojej aplikacji.Zmiana hasła w Firebase dla Androida

Zawarłem com.google.firebase:firebase-auth:9.0.2 w moim pliku i jak dotąd wszystko działało dobrze, dopóki nie próbowałem zaimplementować funkcji zmiany hasła.

Zauważyłem, że obiekt FirebaseUser ma metodę updatePassword, która pobiera nowe hasło jako parametr. Mogłabym skorzystać z tej metody i sama wdrożyć weryfikację. Potrzebuję jednak bieżącego hasła użytkownika, aby porównać je z wprowadzonym hasłem i nie mogę znaleźć sposobu na uzyskanie tego hasła.

Znalazłem także inny obiekt method na obiekcie Firebase, który pobiera stare hasło, nowe hasło i moduł obsługi. Problem polega na tym, że trzeba także com.firebase:firebase-client-android:2.5.2+ dostęp do tej klasy, a gdy próbuję tej metody Dostaję do następującego błędu:

Projects created at console.firebase.google.com must use the new Firebase Authentication SDKs available from firebase.google.com/docs/auth/

Poczuj jakbym czegoś brakuje tutaj. Jakie jest zalecane podejście do wdrożenia tego? A kiedy użyć zależności?

+0

spróbować . –

Odpowiedz

17

znalazłem poręczny przykład tego w Firebase docs:

Some security-sensitive actions—such as deleting an account, setting a primary email address, and changing a password—require that the user has recently signed in. If you perform one of these actions, and the user signed in too long ago, the action fails and throws FirebaseAuthRecentLoginRequiredException. When this happens, re-authenticate the user by getting new sign-in credentials from the user and passing the credentials to reauthenticate. For example:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 

// Get auth credentials from the user for re-authentication. The example below shows 
// email and password credentials but there are multiple possible providers, 
// such as GoogleAuthProvider or FacebookAuthProvider. 
AuthCredential credential = EmailAuthProvider 
     .getCredential("[email protected]", "password1234"); 

// 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) { 
       if (task.isSuccessful()) { 
        user.updatePassword(newPass).addOnCompleteListener(new OnCompleteListener<Void>() { 
         @Override 
         public void onComplete(@NonNull Task<Void> task) { 
          if (task.isSuccessful()) { 
           Log.d(TAG, "Password updated"); 
          } else { 
           Log.d(TAG, "Error password not updated") 
          } 
         } 
        }); 
       } else { 
        Log.d(TAG, "Error auth failed") 
       } 
      } 
     }); 
7

Nie ma możliwości odzyskania bieżącego hasła użytkownika z uwierzytelniania Firebase.

Jednym ze sposobów, aby umożliwić użytkownikom zmianę hasła, jest wyświetlenie okna dialogowego, w którym podaje się aktualne hasło i nowe hasło. Następnie użytkownik sign in (lub re-authenticate) użytkownik z bieżącym hasłem i wywołanie updatePassword(), aby go zaktualizować.

8

Zmiana hasła w Firebase jest nieco kłopotliwe. to nie jest to, co zwykle robimy w celu zmiany hasła w skryptach po stronie serwera i bazy danych. Aby zaimplementować zmianę hasła w swojej aplikacji, najpierw musisz pobrać wiadomość e-mail użytkownika z FirebaseAuth lub poprosić użytkownika o wprowadzenie adresu e-mail, a następnie poprosić użytkownika o wpisanie starego hasła, ponieważ nie można pobrać hasła użytkownika, jak powiedział Frank van Puffelen. Następnie musisz go ponownie uwierzytelnić. Po ponownym uwierzytelnieniu, jeśli się powiedzie, możesz użyć updatePassword(). Dodałem próbkę poniżej tej, którą użyłem do mojej własnej aplikacji. Hope, to ci pomoże.

private FirebaseUser user; 
user = FirebaseAuth.getInstance().getCurrentUser(); 
       final String email = user.getEmail(); 
       AuthCredential credential = EmailAuthProvider.getCredential(email,oldpass); 

       user.reauthenticate(credential).addOnCompleteListener(new OnCompleteListener<Void>() { 
        @Override 
        public void onComplete(@NonNull Task<Void> task) { 
         if(task.isSuccessful()){ 
           user.updatePassword(newPass).addOnCompleteListener(new OnCompleteListener<Void>() { 
            @Override 
            public void onComplete(@NonNull Task<Void> task) { 
             if(!task.isSuccessful()){ 
              Snackbar snackbar_fail = Snackbar 
                .make(coordinatorLayout, "Something went wrong. Please try again later", Snackbar.LENGTH_LONG); 
              snackbar_fail.show(); 
             }else { 
              Snackbar snackbar_su = Snackbar 
                .make(coordinatorLayout, "Password Successfully Modified", Snackbar.LENGTH_LONG); 
              snackbar_su.show(); 
             } 
            } 
           }); 
         }else { 
          Snackbar snackbar_su = Snackbar 
            .make(coordinatorLayout, "Authentication Failed", Snackbar.LENGTH_LONG); 
          snackbar_su.show(); 
         } 
        } 
       }); 
      } 
     } 
-2

Zapytanie obraca się wokół użytkowników zapominając hasła lub chcąc zresetować swoje hasła za pomocą listu e-mail. Które mogą być osiągnięte przez Auth.sendPasswordResetEmail("[email protected]");

zacząć od inicjowania

private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthListener; 
    private String DummyEmail = "[email protected]" 

mAuth = FirebaseAuth.getInstance(); 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      if (firebaseAuth.getCurrentUser() == null) { 
      } 
     } 
    }; 

Gdzieś indziej, gdy użytkownik zażąda, aby zaktualizować lub resetowanie hasła po prostu dostęp do Mauth,

private void PassResetViaEmail(){ 
    if(mAuth != null) { 
     Log.w(" if Email authenticated", "Recovery Email has been sent to " + DummyEmail); 
     mAuth.sendPasswordResetEmail(DummyEmail); 
    } else { 
     Log.w(" error ", " bad entry "); 
    } 
    } 

Teraz niepotrzebne jest obciążanie się zapytaniami wokół bazy danych, aby dowiedzieć się, czy wyjście Email s lub nie, Firebase mAuth poradzi sobie z tym.

Czy wiadomość e-mail jest uwierzytelniona?Czy jest aktywny na liście uwierzytelniania? Następnie wyślij e-mail z resetem hasła.

enter image description here

Zawartość będzie wyglądać podobnie jak ten link

enter image description here

reset poprosi następujący dialog na nowej stronie internetowej io

Extra

, jeśli nie podoba ci się szablon resetowania "opracowany" przez Firebase. Możesz łatwo uzyskać dostęp i dostosować własną literę z konsoli Firebase. Uwierzytelnianie> Szablony email> zresetować hasło

enter image description here

Powiązane problemy