Аутентификация Firebase через Google Play Игры - PullRequest
0 голосов
/ 12 декабря 2018

Я хотел бы использовать аутентификацию в играх Google Play, но всегда после второго входа в систему или запроса на связывание (первый был успешным) получено:

Firebase.FirebaseException: произошла внутренняя ошибка.[Ошибка получения токена доступа из GOOGLE_PLAY_GAMES, URI перенаправления OAuth2: http://localhost, ответ: OAuth2TokenResponse {params: error = invalid_grant & error_description = Bad% 20Request, httpMetadata: HttpMetadata {status = 400, cachePolicy = NOICUUT = NO_CMS)= false, staleWhileRevalidate = null, имя файла = null, lastModified = null, заголовки = HTTP / 1.1 200 OK, cookieList = []}}]

Когда я удаляю пользователя, имя входа снова работает правильно,Должен ли я установить что-то в консоли Firebase для решения этой проблемы?

Аутентификация в сценариях GPG:

    public void Init()
    {
        PlayGamesHelperObject.CreateObject();

        PlayGamesHelperObject.RunOnGameThread(() =>
        {
            PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
                .RequestServerAuthCode(false)
                .Build();

            PlayGamesPlatform.DebugLogEnabled = true;

            PlayGamesPlatform.InitializeInstance(config);
            Social.Active = PlayGamesPlatform.Activate();
        });
    }

    public void Authenticate(Action<bool, ILocalUser, string> onAuth)
    {
        if (Social.localUser == null)
        {   
            onAuth.Invoke(false, Social.localUser, string.Empty);
            return;
        }
        if (Social.localUser.authenticated)
        {
            onAuth.Invoke(true, Social.localUser, PlayGamesPlatform.Instance.GetServerAuthCode());
            return;
        }

        PlayGamesHelperObject.RunOnGameThread(() =>
        {
            Social.Active.Authenticate(Social.localUser, (status)=>
            {
                onAuth.Invoke(status, Social.localUser, PlayGamesPlatform.Instance.GetServerAuthCode());
            });
        });
    }

При вызове аутентификации:

    private FirebaseUser User { get; set; }
    private GoogleAuth Auth { get; set; }

    event Action<Exception> onSingInFailed = delegate { };
    event Action<FirebaseUser> onSignInSocials = delegate { };
    event Action<FirebaseUser> onLinkInSocials = delegate { };

    public void OnSocialsLogin(bool status, ILocalUser user, string authCode)
    {
        if(status)
        {
            Credential credential = PlayGamesAuthProvider.GetCredential(authCode);

            if (User == null)
                Auth.SignInWithCredential(credential, onSignInSocials, onSingInFailed);
            else
                Auth.LinkWithCredential(User, credential, onLinkInSocials, (exc) =>
                {
                    onLinkFailed.Invoke(exc);
                    Auth.SignInWithCredential(credential, onSignInSocials, onSingInFailed);
                });
       }
    }

Часть класса GoogleAuth:

    private static FirebaseAuth Auth { get; set; }
    public void SignInWithCredential(Credential credential, Action<FirebaseUser> onSignIn, Action<Exception> onFailure, Action onCanceled = default(Action))
        {
            if (onCanceled == null)
                onCanceled = delegate { };

            Auth.SignInWithCredentialAsync(credential).ContinueWith(task =>
            {
                if (task.IsCanceled)
                    onCanceled.Invoke();

                else if (task.IsFaulted)
                    onFailure.Invoke(task.Exception);

                else if (task.IsCompleted)
                    onSignIn.Invoke(task.Result);
            });            
    }

    public void LinkWithCredential(FirebaseUser user, Credential credential, Action<FirebaseUser> onLinkIn, Action<Exception> onFailure, Action onCanceled = default(Action))
    {
        if (onCanceled == null)
            onCanceled = delegate { };

        user.LinkWithCredentialAsync(credential).ContinueWith(task =>
        {
            if (task.IsCanceled)
                onCanceled.Invoke();

            else if (task.IsFaulted)
                onFailure.Invoke(task.Exception);

            else if (task.IsCompleted)
                onLinkIn.Invoke(task.Result);
        });
    }
...