В Firebase SDK для Java createUser () не возвращает uid

Я пытаюсь найти чистый и простой способ получить uid в результате вызова createUser() при работе с Java SDK. Это легко сделать при работе с Javascript SDK (например, этот вопрос / ответ). Я также видел вопрос, поднятый в Stackoverflow, в контексте Firebase iOS API, где он видимо не так-то просто. Моя проблема в том, как это сделать с помощью Firebase Java SDK. В частности, мой вариант использования такой же, как и в вопросе, связанном с iOS, т.е. разрешить пользователю с правами администратора создавать учетные записи пользователей (аутентификация по электронной почте / паролю), а также хранить другую информацию о созданном пользователе в Firebase с uid в качестве ключа. Знание и использование uid в качестве ключа важно, поскольку он является основой правил безопасности.

Я видел пару предложенных решений, оба из которых включали некоторую процедуру, которую нужно было выполнить после создания новой учетной записи пользователя. Эти

В любом случае у меня есть запутанное решение с несколькими асинхронными обратными вызовами для решения проблемы, которая тривиальна при использовании Javascript API.

Поэтому у меня есть три конкретных вопроса:

  1. Есть ли в настоящее время лучший подход, чем два, которые я перечислил выше?
  2. Если я использую второй подход и вхожу в систему как только что созданный пользователь, не отменяет ли это токен администратора (т. Е. Выхожу из системы администратора, создавшего пользователя), что, в свою очередь, означает, что применяются новые правила безопасности?
  3. Есть ли какие-либо ожидания, что SDK для Android и Java будут обновлены в ближайшее время, чтобы createUser() API был таким же, как версия Javascript?

ОБНОВЛЕНИЕ. Копнув глубже и немного поэкспериментировав, я нашел ответы на свои вопросы. Оказывается, документация по API, предоставленная Firebase, устарела и / или противоречива.

По вопросу 1. Согласно Javadoc для createUser () единственный доступный обработчик обратного вызова - Firebase.ResultHandler. Однако, согласно журналу изменений, Справочный документ по API и документация на Создание учетных записей пользователей, также можно использовать Firebase.ValueResultHandler. Это обеспечивает прямой доступ к UID.

По вопросу 2: Да. Аутентификация вновь созданной учетной записи пользователя приводит к замене токена auth.

По вопросу 3: Настоящий вопрос должен звучать так: «Когда люди, работающие с Firebase, обновят Javadoc?» Или, может быть, лучше спросить: «Почему новые версии SDK выпускаются без обновленной и точной документации?»


person LJ in NJ    schedule 06.03.2015    source источник


Ответы (2)


Следующий код - правильный способ справиться с созданием нового пользователя.

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
    }
});

Я обновил вопрос, чтобы объяснить причины.

person LJ in NJ    schedule 07.03.2015

Попробуй это. Это для новой версии Firebase, которая вышла в последней версии Google I / O. Я не продвигаю эту новую версию и не откладываю старую версию. Я просто заявляю это как альтернативу приведенному выше решению:

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
        }
    }
});

Теперь вы можете добавить AuthStateListener. Вам нужно будет поместить код в методы onCreate, onStart и onStop. Обратите внимание, что приведенный выше код может использоваться любым разумным методом (например, onCreate, onStart, onResume и т. Д.). Вот так:

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);
    }
}

В конце концов, что происходит, когда пользователь создается (и одновременно входит в систему), mAuthListener выполняет обратный вызов (он выполняет все, что находится внутри mAuthListener, который в этом случае получает UID пользователя и выполняет прочая ерунда с ней). Если вам нужна помощь с этой новой Firebase в Android, вот ссылка, которая поможет вам: https://firebase.google.com/docs/android/setup

person Anish Muthali    schedule 01.07.2016