简体   繁体   English

如何从 Xamarin Auth 获取访问令牌 - Google

[英]How to get accesstoken from Xamarin Auth - Google

I am trying to get auth token from 0auth2 in the android app.我正在尝试从 android 应用程序中的 0auth2 获取身份验证令牌。 The issue is once i sign, in the app is restaring because of the redirect url but I am not getting any auth token from the intent once the app is restarted.问题是一旦我签名,应用程序就会因为重定向 url 而重新启动,但是一旦应用程序重新启动,我就没有从意图中获得任何身份验证令牌。

code代码

var authenticator = new OAuth2Authenticator(ClientID, ClientSecret, Scope, new Uri("https://accounts.google.com/o/oauth2/auth"),
                new Uri("com.app.abcd:/oauthredirect"), new Uri("https://oauth2.googleapis.com/token"), null, true);
 authenticator.Completed += OnAuthCompleted;
                authenticator.Error += OnAuthError;
                var presenter = new Xamarin.Auth.Presenters.OAuthLoginPresenter();
                presenter.Login(authenticator);

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

            IsAuthorized = e.IsAuthenticated;
            //User user = null;
            if (e.IsAuthenticated)
            {}
}

Android安卓

[Activity(Label = "ABCD", MainLauncher = true, LaunchMode = LaunchMode.SingleTask, ConfigurationChanges = ConfigChanges.ScreenSize, ScreenOrientation = ScreenOrientation.Portrait)]
    [IntentFilter(new[] { Intent.ActionView },
              Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
        //DataScheme = "abcd",
         DataSchemes = new[] { "com.app.abcd" },
               DataPath = "/oauthredirect",
              AutoVerify = true)]

    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {

protected override void OnCreate(Bundle bundle)
        {
            base.SetTheme(Resource.Style.MainTheme);
                base.OnCreate(bundle);
                DependencyService.Register<ChromeCustomTabsBrowser>();
                CrossCurrentActivity.Current.Activity = this;

                TabLayoutResource = Resource.Layout.Tabbar;
                ToolbarResource = Resource.Layout.Toolbar;

                global::Xamarin.Forms.Forms.Init(this, bundle);
                LoadApplication(new App());
        }
protected override void OnNewIntent(Intent intent)
        {
            base.OnNewIntent(intent);
            //HandleNotificationIntent(intent);
        }

        protected override void OnRestart()
        {
            var intent = this.Intent;
            base.OnRestart();
        }
}

When i run this code and presenter.Login(authenticator);当我运行此代码和presenter.Login(authenticator); is called i can see the google authenticates the user and OnNewIntent is called and app is restarted and OnAuthCompleted is never called and I am not able to get the access token.被调用时,我可以看到 google 对用户进行了身份验证,并OnNewIntent并重新启动了应用程序,并且从未调用过OnAuthCompleted并且我无法获取访问令牌。

Is this the right way to get accesstoken form 0auth2 or am i missing something?这是从 0auth2 获取访问令牌的正确方法还是我遗漏了什么? can anyone help me with this.谁能帮我这个。

I found the solution.我找到了解决方案。 Check out the example here .此处查看示例。

Common Code :通用代码

 private void Authenticate()
        {
            var authenticator = new OAuth2Authenticator(ClientID, ClientSecret, Scope, new Uri("https://accounts.google.com/o/oauth2/auth"),
                            new Uri("com.app.abcd:/oauthredirect"), new Uri("https://oauth2.googleapis.com/token"), null, true);
            authenticator.Completed += OnAuthCompleted;
            authenticator.Error += OnAuthError;
            var presenter = new Xamarin.Auth.Presenters.OAuthLoginPresenter();
            presenter.Login(authenticator);
        }

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

            IsAuthorized = e.IsAuthenticated;
            //User user = null;
            if (e.IsAuthenticated)
            {
                var access_token = e.Account.Properties["access_token"];
                var expires_in = e.Account.Properties["expires_in"];
                var refresh_token = e.Account.Properties["refresh_token"];
            }
        }

ANDROID : Create a new activity: ANDROID :创建一个新活动:

[Activity(Label = "ActivityCustomUrlSchemeInterceptor", NoHistory = true, LaunchMode = LaunchMode.SingleTop)]
    [IntentFilter(
        new[] { Intent.ActionView },
        Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
        DataSchemes = new[] { "com.app.abcd" },
        DataPath = "/oauthredirect")]
    public class ActivityCustomUrlSchemeInterceptor : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            global::Android.Net.Uri uri_android = Intent.Data;

            // Convert Android.Net.Url to Uri
            var uri = new Uri(uri_android.ToString());
            // Close browser 
            var intent = new Intent(this, typeof(MainActivity));
            //intent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
            StartActivity(intent);

            // Load redirectUrl page
            // if the code below isn't accessible, pass `authenticator`
            // created in the common code here which has `OnPageLoading(uri);` method 
           OAuthAuthenticatorHelper.AuthenticationState.OnPageLoading(uri);
            this.Finish();
        }
    }

iOS IOS

Add couple of lines in OpenUrl to handle the url redirectOpenUrl添加几行来处理 url 重定向

public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
        {
            // Convert iOS NSUrl to C#/netxf/BCL System.Uri - common API
            Uri uri_netfx = new Uri(url.AbsoluteString);

            // load redirect_url Page for parsing
            OAuthAuthenticatorHelper.AuthenticationState.OnPageLoading(uri_netfx);

            return true;
        }

In info.plist add the urlscheme of the package name:在 info.plist 中添加包名的 urlscheme:

<key>CFBundleURLSchemes</key>
            <array>
              <string>com.app.abcd</string>
            </array>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM