Почему Firebase не может получить PlayGames AuthCode и передать его в свои учетные данные? - PullRequest
0 голосов
/ 14 апреля 2020

Для начала я работаю над игрой Unity, где я аутентифицирую пользователя при запуске игры. Моя среда сборки android. Я использую аутентификацию Firebase для Google Play Games Services для аутентификации пользователя.

Когда игра запускается на моем устройстве или эмуляторе android, она может аутентифицировать Play Games Services, а также подключаться к Firebase (я получаю аналитические данные). Однако, когда я передаю код авторизации PlayGames в учетные данные Firebase.Auth, он перестает выполнять код (для этого у меня есть журнал отладки). В LogCat не выдается никакой ошибки, кроме

Firebase | server_auth_code

Я пытался искать в Интернете различные проблемы, но ничего. Я проверил свои ключи в настройках плеера, настройках firebase, учетных данных OAuth 2.0 на консоли Google API и даже проверил ключи в моей консоли Google Play (которую я не использую на данном этапе). Я даже проверил адреса электронной почты моих тестовых пользователей в игровых сервисах и попробовал несколько аккаунтов в Google Play. Но проблема все еще сохраняется.

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

using GooglePlayGames;
using GooglePlayGames.BasicApi;
using UnityEngine.SocialPlatforms;
using System.Threading.Tasks;

public class SetFirebase : MonoBehaviour
{
    string authCode;
    void Start()
    {
        PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().
        RequestServerAuthCode(false /* Don't force refresh */).Build();

        PlayGamesPlatform.InitializeInstance(config);
        PlayGamesPlatform.Activate();
        Social.localUser.Authenticate((bool success) =>
        {
            if (success)
            {
                authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
                Debug.Log("PlayGames successfully authenticated!");
                Debug.Log("AuthCode: " + authCode);
            }
            else
            {
                Debug.Log("PlayGames SignIn Failed");
            }
        });

        Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
        {
            var dependencyStatus = task.Result;
            if (dependencyStatus == Firebase.DependencyStatus.Available)
            {
                Debug.Log("Firebase Ready!!!");
                RunFirebase();
            }
            else
            {
                Debug.LogError(System.String.Format("Could not resolve all Firebase dependencies: {0}", dependencyStatus));
            }
        });
    }    

    private void RunFirebase(){
        Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
        Debug.Log("init firebase auth ");

        Firebase.Auth.Credential credential = Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode);
        Debug.Log(" passed auth code ");

        auth.SignInWithCredentialAsync(credential).ContinueWith(task =>
        {
            if (task.IsCanceled)
            {
                Debug.LogError("SignInOnClick was canceled.");
                return;
            }
            if (task.IsFaulted)
            {
                Debug.LogError("SignInOnClick encountered an error: " + task.Exception);
                return;
            }
            Firebase.Auth.FirebaseUser newUser = task.Result;
            Debug.LogFormat("SignInOnClick: User signed in successfully: {0} ({1})", newUser.DisplayName, newUser.UserId);
        });    
    }
}

Мой LogCat выполняет все до "initb firebase auth" , но не выполняет "переданный код авторизации" , так что я знаю, что есть некоторая проблема при передаче полномочий. Он также не запускает ничего внутри auth.SignInWithCredentialAsyn c (учетные данные) .

Любая помощь или предложение будут высоко оценены. Спасибо.

1 Ответ

1 голос
/ 14 апреля 2020

Я могу предложить две вещи:

1) Заменить ContinueWith на ContinueWithOnMainThread. Это расширение Firebase , которое гарантирует, что ваша логика c будет работать в главном потоке Unity (что, как правило, решает многие проблемы Unity, определенные c). Я go более подробно об этом здесь .

2) У вашего лога c может быть состояние состязания между обратным вызовом Authenticate и продолжением CheckAndFixDependenciesAsync. Они не обязательно будут работать в том порядке, в каком вы видите их в своей логике c.

Если бы я строил эту систему, я мог бы предпочесть использовать сопрограммы и пользовательскую инструкцию выхода :

class Authenticate : CustomYieldInstruction
{
    private bool _keepWaiting = true;
    public override bool keepWaiting => _keepWaiting;

    public Authenticate(Social.ILocalUser user) {
        user.Authenticate((bool success)=>{
            /* old authentication code here */
            _keepWaiting = false;
        });
    }

}

Тогда в сопрограмме есть что-то вроде:

private IEnumerator InitializeCoroutine() {
    /* old authentication code */

    // I'm ignoring error checking for now, but it shouldn't be hard to figure in.
    // I'm mostly going from memory now anyway

    // start both authentication processes in parallel
    var authenticate = new Authenticate(Social.localUser);
    var firebaseDependenciesTask = FirebaseApp.CheckAndFixDependenciesAsync();

    // wait on social
    yield return authenticate;

    // wait on Firebase. If it finished in the meantime this should just fall through
    yield return new WaitUntil(()=>firebaseDependenciesTask.IsComplete);

    RunFirebase();
}

Таким образом, моя логика c выглядит примерно синхронно, сохраняя при этом асинхронность (проверка орфографии утверждает, что я составил это слово ) систем, от которых вы зависите и , вы избегаете проблем, связанных с многопоточностью, которые возникают при использовании ContinueWith.

Дайте мне знать, если это поможет!

- Patrick

...