2015-03-06 7 views
0

J'essaie de trouver un moyen simple et simple d'obtenir le uid résultant d'un appel à createUser() lorsque vous travaillez avec le SDK Java. Ceci est facile à faire lorsque vous travaillez avec le SDK Javascript (par exemple, this question/answer). J'ai également vu la question soulevée sur Stackoverflow dans le context of the Firebase iOS API où apparemment ce n'est pas si facile. Mon problème est de savoir comment le faire en utilisant le Firebase Java SDK. Plus précisément, mon cas d'utilisation est identique à celui de la question iOS, à savoir autoriser un utilisateur Admin à créer des comptes utilisateur (authentification par e-mail/mot de passe) et stocker d'autres informations sur l'utilisateur créé dans Firebase. Connaître et utiliser l'uid comme une clé est essentiel car c'est la base des règles de sécurité.Dans Firebase SDK pour Java createUser() ne renvoie pas uid

J'ai vu quelques solutions proposées, qui impliquaient toutes deux une procédure à effectuer après la création du nouveau compte d'utilisateur. Ce sont

De toute façon j'ai une solution alambiquée avec plusieurs callbacks async pour faire face à un problème qui est trivial lorsque vous utilisez l'API Javascript.

J'ai donc trois questions précises:

  1. est-il actuellement une meilleure approche que les deux répertoriées ci-dessus?
  2. Si j'utilise la 2ème approche et que je me connecte en tant qu'utilisateur nouvellement créé, cela ne remplace-t-il pas le jeton Admin (c'est-à-dire, déconnecte l'administrateur qui a créé l'utilisateur)?
  3. Y at-il une attente que les SDK Java & Android seront mis à jour de sitôt afin que l'API createUser() est la même que la version Javascript?

MISE À JOUR: Creuser plus profond et d'expérimenter un peu, j'ai trouvé les réponses à mes questions. Il s'avère que la documentation API fournie par Firebase est obsolète et/ou incohérente.

Re Q1: Selon le Javadoc for createUser() le seul gestionnaire de rappel disponible est un Firebase.ResultHandler. Cependant selon le Changelog, le API Reference document, et la documentation sur Creating User Accounts, un Firebase.ValueResultHandler peuvent également être utilisés. Ceci fournit un accès direct à l'UID

Re Q2: La réponse est oui. L'authentification du nouveau compte d'utilisateur entraîne le remplacement du jeton auth.

Re Q3: La vraie question devrait être "Quand les gens de Firebase vont mettre à jour le Javadoc?" Ou peut-être une meilleure question est "Pourquoi les nouvelles versions du SDK sont-elles publiées sans documentation mise à jour et précise?"

Répondre

3

Le code suivant est la bonne façon de faire face à la création d'un nouvel utilisateur

Firebase ref = new Firebase("https://<YOUR-FIREBASE>.firebaseio.com"); 
    ref.createUser("[email protected]", "badPassword", new Firebase.ValueResultHandler<Map<String, Object>>() { 

    public void onSuccess(Map<String, Object> result) { 
     System.out.println("New account with uid: " + result.get("uid")); 
    } 

    public void onError(FirebaseError firebaseError) { 
     // there was an error 
    } 
}); 

J'ai mis à jour la question d'expliquer les raisons.

0

Essayez ceci.C'est pour la nouvelle version de Firebase qui est apparue dans les dernières E/S de Google. Je ne fais pas la promotion de cette nouvelle version ou de mettre l'ancienne version. Je décris simplement cela comme une alternative à la solution ci-dessus:

mAuth = FirebaseAuth.getInstance(); 

//creates the user with email and password...make this another type of login if you want 
mAuth.createUserWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(signup.this, new OnCompleteListener<AuthResult>() { 
    @Override 
    public void onComplete(@NonNull Task<AuthResult> task) { 
     if (task.isSuccessful()) { 
      //do something 
     } 
    } 
}); 

Maintenant, vous pouvez ajouter un AuthStateListener. Vous devrez mettre du code dans les méthodes onCreate, onStart et onStop. Notez que le code ci-dessus peut aller dans n'importe quelle méthode raisonnable (par exemple onCreate, onStart, onResume, etc.). nous allons ici:

FirebaseAuth mAuth; 
FirebaseAuth.AuthStateListener mAuthListener; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_something); 

    mAuth = FirebaseAuth.getInstance(); 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 
      if(user != null){ 
       //check for null to prevent NullPointerException when dealing with user 
       if(!user.getUid().matches("")){ 
        //make this check just in case...I've experienced unexplainable glitches here 
        String uid = user.getUid(); 
        //do more stuff with Uid 
       } 
      } 
     } 
    } 
} 

@Override 
public void onStart(){ 
    super.onStart(); 
    mAuth.addAuthStateListener(mAuthListener); 
} 

@Override 
public void onStop(){ 
    super.onStop(); 
    if(mListener != null){ 
     mAuth.removeAuthStateListener(mAuthListener); 
    } 
} 

En fin de compte, ce qui se passe est, une fois que l'utilisateur est créé (et signé en même temps), le mAuthListener fait un rappel (il exécute tout ce qui est à l'intérieur du mAuthListener, qui, dans ce cas, obtient l'UID de l'utilisateur et fait d'autres choses avec). Si vous avez besoin d'aide avec cette nouvelle Firebase dans Android, voici un lien pour vous aider: https://firebase.google.com/docs/android/setup