Я хотел бы использовать аутентификацию в играх 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);
});
}