Xamarin.Forms Google API使用身份提供程序验证用户

时间:2017-08-14 22:51:29

标签: c# .net xamarin xamarin.forms google-authentication

我仍然习惯了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),
            null,
            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), null, 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 1Link 2Link 3,但仍然无法解决问题。

我不确定错误的来源,或者我可以继续调试以解决问题。

提前致谢

解决方案

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

1 个答案:

答案 0 :(得分:1)

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

维杰。