Вызов облачной функции admin.auth (). CreateUser () из android не работает - PullRequest
2 голосов
/ 07 марта 2020

Я пытаюсь вызвать облачную функцию Google из приложения Android, которое не работает (первый вызов сразу после развертывания работает в 90% случаев, но последующие вызовы не выполняются, в консоли журнала Firebase также ничего не отображается).

public Task<String> myCloudFunction() {

    return FirebaseFunctions.getInstance()
            .getHttpsCallable("createUser")
            .call(data)
            .continueWith(task -> {
                String result = (String) task.getResult().getData();
                return result;
            });

}

Конечная точка в панели инструментов функций https://us-central1-xyz: 555.cloudfunctions.net/createUser

Вот как я ее называю.

public void callCloudFunction() {

    createFirebaseUserAccount.myCloudFunction()
            .addOnCompleteListener(new OnCompleteListener<String>() {
                @Override
                public void onComplete(@NonNull Task<String> task) {
                    if (!task.isSuccessful()) {
                        Exception e = task.getException();
                        if (e instanceof FirebaseFunctionsException) {
                            FirebaseFunctionsException ffe = (FirebaseFunctionsException) e;
                            FirebaseFunctionsException.Code code = ffe.getCode();
                            Object details = ffe.getDetails();
                        } else {
                            Timber.d(task.getResult());
                        }
                    }
                }
            });
}

Вот облачная функция: $ GOOGLE_APPLICATION_CREDENTIALS указывает на файл service_key. json файл, содержащий закрытый ключ.

admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: "https://XYZ.firebaseio.com"
});
exports.createUser = functions.https.onCall((data, context) => {
 const callerEmail = data.email;
 const callerPassword = data.password;
 const callerDisplayName = data.displayName;
 return admin.auth().createUser({ 
    email: callerEmail,
    emailVerified: false,
    password: callerPassword,
    displayName: callerDisplayName,
    disabled: false
   }).then(userRecord => {
        // See the UserRecord reference doc for the contents of userRecord.
        console.log("Successfully created new user:", userRecord.uid);
        return userRecord.uid;

    }).catch(error => {
        console.log("Error creating new user ", error);
        return error;
    });
  });

Спасибо за чтение! :)

1 Ответ

2 голосов
/ 08 марта 2020

Вы не возвращаете обещание из функции, которая содержит данные для отправки клиенту. На самом деле, вы ничего не передаете. Вместо этого вы должны вернуть цепочку обещаний из вашей асин c работы:

return admin.auth().createUser({ 
    email: callerEmail,
    emailVerified: false,
    password: callerPassword,
    displayName: callerDisplayName,
    disabled: false
   }).then(userRecord => {
        // See the UserRecord reference doc for the contents of userRecord.
        console.log("Successfully created new user:", userRecord.uid);
        return userRecord.uid;

    }).catch(error => {
        console.log("Error creating new user ", error);
        return error;
    });

Обратите внимание на новый return перед всем этим. Вам определенно нужно некоторое время, чтобы узнать о том, как JavaScript обещания работают, чтобы эффективно использовать облачные функции, и они не будут работать правильно без соблюдения их правил и соглашений.

...