首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表单/Android GoogleSignInAPI登录在一段时间后无法加载

表单/Android GoogleSignInAPI登录在一段时间后无法加载
EN

Stack Overflow用户
提问于 2021-06-25 19:15:16
回答 1查看 192关注 0票数 0

我一直想将Google身份验证添加到我的Xamarin.Forms应用程序中,而Xamarin.Android部分正在制造麻烦。基于YouTube教程,我包含了所需的库并包含了必要的代码(参见下面)。

对于API,我使用和Google平台(需要获取API密钥)。当将我的应用程序安装到一个设备上时,无论是物理的还是模拟的,签名过程在接下来的3-5天内都能正常工作。我可以选择一个谷歌帐户和认证。然而,之后,登录屏幕将被卡在加载中。

有时,不经常,API会返回。

状态{statusCode=INTERNAL_ERROR,resolution=null} (请阅读下面我尝试过的内容)

用于此过程的库:

使用Android.Gms.Auth.Api;使用Android.Gms.Auth.Api.SignIn;使用Android.Gms.Common;使用Android.Gms.Common.Apis;使用Android.OS;

预期行为:

像往常一样,Google登录弹出并自动登录用户(如果他们过去已经选择了一个帐户),或者显示可用的帐户并继续验证用户的身份。这就是它的样子,对不起德国人 到底出了什么事:

登录视图确实会弹出,尽管它只是继续加载。只有重新安装整个应用程序才能帮助修复它。

我尝试过的:

如上文所述,我有时确实

状态{statusCode=INTERNAL_ERROR,resolution=null}

返回。我已经研究过这个错误,并发现我的安卓应用程序的SHA1密钥无效或不存在可能是原因。我检查了Firebase,我的Debug和都增加了。

什么是可提及的:

  • 在启动应用程序时,登录过程总是进行的。不管是否登录。这可能是一个原因,但我不知道我该选择什么。也许存储IdToken并使用它直到它过期?
  • 为了验证用户服务器端,我请求电子邮件和IdToken。
  • 我使用的是不推荐的Android.Gms.Common.Apis

GoogleManager.cs

代码语言:javascript
复制
public class GoogleManager : Java.Lang.Object, IGoogleManager, GoogleApiClient.IConnectionCallbacks, GoogleApiClient.IOnConnectionFailedListener
    {
        public Action<GoogleUser, string> _onLoginComplete;
        public static GoogleApiClient _googleApiClient { get; set; }
        public static GoogleManager Instance { get; private set; }
        Context _context;

        public GoogleManager()
        {
            _context = global::Android.App.Application.Context;
            Instance = this;
        }

        public void Login(Action<GoogleUser, string> onLoginComplete)
        {
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn).RequestIdToken("my_stuff.apps.googleusercontent.com")
                                                             .RequestEmail()
                                                             .Build();
            _googleApiClient = new GoogleApiClient.Builder((_context).ApplicationContext)
                .AddConnectionCallbacks(this)
                .AddOnConnectionFailedListener(this)
                .AddApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .AddScope(new Scope(Scopes.Profile))
                .Build();

            _onLoginComplete = onLoginComplete;
            Intent signInIntent = Auth.GoogleSignInApi.GetSignInIntent(_googleApiClient);
            ((MainActivity)Forms.Context).StartActivityForResult(signInIntent, 1);
            _googleApiClient.Connect();
        }

        public void Logout()
        {
            var gsoBuilder = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn).RequestEmail();

            GoogleSignIn.GetClient(_context, gsoBuilder.Build())?.SignOut();

            _googleApiClient.Disconnect();

        }

        public void OnAuthCompleted(GoogleSignInResult result)
        {
            if (result.IsSuccess)
            {
                GoogleSignInAccount accountt = result.SignInAccount;
                _onLoginComplete?.Invoke(new GoogleUser()
                {
                    Name = accountt.GivenName,
                    Email = accountt.Email,
                    ID = accountt.Id,
                    IdToken = accountt.IdToken,
                }, string.Empty);
            }
            else
            {
                _onLoginComplete?.Invoke(null, AppResources.error_this_didnt_work_text);
            }
        }

        public void OnConnected(Bundle connectionHint)
        {

        }

        public void OnConnectionSuspended(int cause)
        {
            _onLoginComplete?.Invoke(null, "Canceled!");
        }

        public void OnConnectionFailed(ConnectionResult result)
        {
            _onLoginComplete?.Invoke(null, result.ErrorMessage);
        }

OnActivityResult来自MainActivity.cs

代码语言:javascript
复制
        protected override void OnActivityResult(int requestCode, Result resultCode, Android.Content.Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);
            if (requestCode == 1)
            {
                GoogleSignInResult result = Auth.GoogleSignInApi.GetSignInResultFromIntent(data);
                Console.WriteLine("LOGIN RESULT" + result.Status + result.SignInAccount);
                GoogleManager.Instance.OnAuthCompleted(result);
            }
        }

希望有人能找到答案。如果你有什么需要知道的,请告诉我

EN

回答 1

Stack Overflow用户

发布于 2021-07-13 02:50:45

如果您得到错误代码8 (INTERNAL_ERROR),请再次检查您的应用程序注册在开发控制台。请注意,每个注册的Android客户端都通过(包名,Android签名证书SHA-1)对进行唯一标识。如果您的调试和生产环境有多个包名/签名证书,请确保注册它们的每一对。核实:

  1. 打开凭据页并选择项目
  2. 确保每一对都有安卓类型的OAuth 2.0客户端ID。要为您的安卓客户端创建一个新的OAuth 2.0客户端ID,请从下拉列表中选择New Credentials->OAuth2 Client ID,选择Android并输入您的包名/签名证书指纹。

要获得您的签名密钥证书,SHA-1:

标准调试密钥

代码语言:javascript
复制
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

其他(自定义)密钥

代码语言:javascript
复制
keytool -list -v -keystore $YOUR_KEYSTORE_LOCATION
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68136115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档