加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Xamarin.Forms Google API使用身份提供程序对用户进行身份

发布时间:2020-12-15 22:46:40 所属栏目:百科 来源:网络整理
导读:我仍然习惯了Xamarin.Forms而且我处于非常基础的水平.我为我的问题经历了很多文章,但最终无法解决它.所以… 目前我正在尝试在我的Xamarin.Forms应用程序中添加Google身份验证,该应用程序使用Droid和iOS(无WP). 到目前为止,我正在关注here的指南.我正在使用Xa
我仍然习惯了Xamarin.Forms而且我处于非常基础的水平.我为我的问题经历了很多文章,但最终无法解决它.所以…

目前我正在尝试在我的Xamarin.Forms应用程序中添加Google身份验证,该应用程序使用Droid和iOS(无WP).
到目前为止,我正在关注here的指南.我正在使用Xamarin.Auth对Google进行身份验证.

这是我的源代码中的一部分.


    private async void GoogleSheetsButton_Tapped()
    {
        string clientId = null;
        string redirectUri = null;

        if (Device.RuntimePlatform == Device.iOS)
        {
            clientId = Constants.iOSClientId;
            redirectUri = Constants.iOSRedirectUrl;
        }
        else if (Device.RuntimePlatform == Device.Android)
        {
            clientId = Constants.AndroidClientId;
            redirectUri = Constants.AndroidRedirectUrl;
        }

        var authenticator = new OAuth2Authenticator(
            clientId,null,Constants.Scope,new Uri(Constants.AuthorizeUrl),new Uri(redirectUri),new Uri(Constants.AccessTokenUrl),true);

        authenticator.Completed += OnAuthCompleted;
        authenticator.Error += OnAuthError;

        AuthenticationState.Authenticator = authenticator;

        var presenter = new Xamarin.Auth.Presenters.OAuthLoginPresenter();
        presenter.Login(authenticator);
    }

问题出在我的方法完成它的工作之后.所以在我的最后一行之后:


    presenter.Login(authenticator);

一切看起来都没问题和调试我遵循编译器没有任何错误的方法,但后来我收到异常,你可以看到here.它是“没有兼容的代码运行”.

这里有一些关于我的源代码的更多信息:

>用于客户端ID和URL的“常量”类的来源


    public static class Constants
    {
        public static string AppName = "....";

        // OAuth
        // For Google login,configure at https://console.developers.google.com/
        public static string iOSClientId = "6.....apps.googleusercontent.com";
        public static string AndroidClientId = "6.....apps.googleusercontent.com";

        // These values do not need changing
        public static string Scope = "https://www.googleapis.com/auth/userinfo.email";
        public static string AuthorizeUrl = "https://accounts.google.com/o/oauth2/auth";
        public static string AccessTokenUrl = "https://www.googleapis.com/oauth2/v4/token";
        public static string UserInfoUrl = "https://www.googleapis.com/oauth2/v2/userinfo";

        // Set these to reversed iOS/Android client ids,with :/oauth2redirect appended
        public static string iOSRedirectUrl = "com.googleusercontent.apps.6......h:/oauth2redirect";
        public static string AndroidRedirectUrl = "com.googleusercontent.apps.6......l:/oauth2redirect";
    }

>验证完成/错误的已实现方法的来源,实际上我仍然因为我的错误而无法点击

 

    async void OnAuthCompleted(object sender,AuthenticatorCompletedEventArgs e)
    {
        var authenticator = sender as OAuth2Authenticator;
        if (authenticator != null)
        {
            authenticator.Completed -= OnAuthCompleted;
            authenticator.Error -= OnAuthError;
        }

        GoogleLoginUser user = null;
        if (e.IsAuthenticated)
        {
            var request = new OAuth2Request("GET",new Uri(Constants.UserInfoUrl),e.Account);
            var response = await request.GetResponseAsync();
            if (response != null)
            {
                string userJson = await response.GetResponseTextAsync();
                user = JsonConvert.DeserializeObject(userJson);
            }

            if (_account != null)
            {
                _store.Delete(_account,Constants.AppName);
            }

            await _store.SaveAsync(_account = e.Account,Constants.AppName);
            await DisplayAlert("Email address",user.Email,"OK");
        }
    }

    void OnAuthError(object sender,AuthenticatorErrorEventArgs e)
    {
        var authenticator = sender as OAuth2Authenticator;
        if (authenticator != null)
        {
            authenticator.Completed -= OnAuthCompleted;
            authenticator.Error -= OnAuthError;
        }

        var message = e.Message;
    }

>我添加的Android MainActivity的来源


    public class MainActivity : FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(bundle);

            Forms.Init(this,bundle);
            global::Xamarin.Auth.Presenters.XamarinAndroid.AuthenticationConfiguration.Init(this,bundle);

            MobileBarcodeScanner.Initialize(Application);

            LoadApplication(new App());
        }
    }

> UrlSchemeInterceptorActivity的来源


    [Activity(Label = "CustomUrlSchemeInterceptorActivity",NoHistory = true,LaunchMode = LaunchMode.SingleTop)]
    [IntentFilter(new[] { Intent.ActionView },Categories = new[] { Intent.CategoryDefault,Intent.CategoryBrowsable },DataSchemes = new[] { "com.googleusercontent.apps.6......l" },DataPath = "/oauth2redirect")]
    public class CustomUrlSchemeInterceptorActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            var uri = new Uri(Intent.Data.ToString());

            AuthenticationState.Authenticator.OnPageLoading(uri);

            Finish();
        }
    }

以下是我深入研究的主要文章=> Link 1,Link 2和Link 3,但仍然无法解决问题.

我不确定错误来自哪里,或者我可以继续调试它以解决问题.

提前致谢

>在Android项目属性中将Android编译器更改为Android 7.0. Screenshot
>确保Android Manifest中的目标是SDK版本. Screenshot
>将所有“Xamarin.Android.*”nuget软件包更新到最低版本25.4.0.1.最有可能的是他们目前是23.3.0.我发现有关更新依赖的问题,所以我进行手动上传.我去手动下载每个包并将其移动到packages文件夹.然后我创建了自己的包源并为路径提供了我的文件夹包,并用它来安装已下载的NuGet包. Screenshot
>之后我的问题解决了.

解决方法

请将您的Android SDK更新为API 24或更高版本,并将其设置为项目的编译版本.并将自定义选项卡及其依赖项的引用程序集更新到v25.x.x.而已.你应该能够让它运作起来.

维杰.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读