public virtual async Task <IOAuth1Account> AuthenticateAsync(IOAuth1Options options)
        {
            // Set the current expected redirect uri
            oauth = new OAuth1(options);

            var url = await oauth.GetInitialUrlAsync();

            tcsAuth = new TaskCompletionSource <IOAuth1Account>();

            // DO TABS
            authSession = new CustomTabsAuthSession();
            authSession.AuthTaskCompletionSource = new TaskCompletionSource <IOAuth1Account>();

            authSession.ParentActivity            = Plugin.SocialAuth.Droid.SocialAuth.CurrentActivity;
            authSession.CustomTabsActivityManager = new CustomTabsActivityManager(authSession.ParentActivity);
            authSession.CustomTabsActivityManager.NavigationEvent += (navigationEvent, extras) =>
            {
                if (navigationEvent == CustomTabsCallback.TabHidden)
                {
                    if (authSession.AuthTaskCompletionSource != null)
                    {
                        authSession.AuthTaskCompletionSource.TrySetCanceled();
                    }
                }
            };

            authSession.CustomTabsActivityManager.CustomTabsServiceConnected += delegate
            {
                var ctam = authSession.CustomTabsActivityManager;
                var ses  = ctam.Session;

                var builder = new CustomTabsIntent.Builder(ses)
                              .SetShowTitle(true);

                var customTabsIntent = builder.Build();
                customTabsIntent.Intent.AddFlags(Android.Content.ActivityFlags.SingleTop | ActivityFlags.NoHistory | ActivityFlags.NewTask);

                CustomTabsHelper.AddKeepAliveExtra(authSession.ParentActivity, customTabsIntent.Intent);

                customTabsIntent.LaunchUrl(authSession.ParentActivity, Android.Net.Uri.Parse(url.AbsoluteUri));
            };

            if (!authSession.CustomTabsActivityManager.BindService())
            {
                tcsAuth.TrySetException(new Exception("CustomTabs not supported."));
            }

            return(await tcsAuth.Task);
        }
        public bool Callback(Intent intent, Bundle state)
        {
            if (authSession == null || intent == null)
            {
                return(false);
            }

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

            // Only handle schemes we expect
            if (!WebUtil.CanHandleCallback(oauth.CallbackUrl, uri))
            {
                return(false);
            }

            var resp = oauth.ParseCallback(uri);

            IDictionary <string, string> items = null;

            var accessTokenTask = Task.Run(async() =>
            {
                items = await oauth.GetAccessTokenAsync(resp);
            });

            accessTokenTask.Wait();

            var account = oauth.GetAccountFromResponse <OAuth1Account>(items);

            if (account == null)
            {
                tcsAuth?.TrySetException(new Exception("Failed to parse server response."));
            }
            else
            {
                tcsAuth?.TrySetResult(account);
            }

            oauth       = null;
            authSession = null;

            return(true);
        }
예제 #3
0
        static async Task BeginAuthentication(WebAuthenticator authenticator)
        {
            try
            {
                var    uri         = (await authenticator.GetInitialUrl());
                string redirectUrl = uri.GetParameter("redirect_uri");
                var    scheme      = new Uri(redirectUrl).Scheme;

                var authSession = new CustomTabsAuthSession
                {
                    Authenticator  = authenticator,
                    ParentActivity = activityLifecycleManager.CurrentActivity,
                };

                authenticators[scheme] = authSession;
                authSession.CustomTabsActivityManager = new CustomTabsActivityManager(authSession.ParentActivity);
                authSession.CustomTabsActivityManager.CustomTabsServiceConnected += delegate
                {
                    var builder = new CustomTabsIntent.Builder(authSession.CustomTabsActivityManager.Session)
                                  .SetShowTitle(true);

                    var customTabsIntent = builder.Build();
                    customTabsIntent.Intent.AddFlags(Android.Content.ActivityFlags.SingleTop | ActivityFlags.NoHistory | ActivityFlags.NewTask);

                    CustomTabsHelper.AddKeepAliveExtra(authSession.ParentActivity, customTabsIntent.Intent);

                    customTabsIntent.LaunchUrl(authSession.ParentActivity, Android.Net.Uri.Parse(uri.AbsoluteUri));
                };

                if (!authSession.CustomTabsActivityManager.BindService())
                {
                    authenticator.OnError("CustomTabs not supported.");
                    authenticators.Remove(scheme);
                }
            }
            catch (Exception ex)
            {
                authenticator.OnError(ex.Message);
            }
        }
        public bool Callback(Intent intent, Bundle state)
        {
            if (authSession == null || intent == null)
            {
                return(false);
            }

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

            // Only handle schemes we expect
            if (!WebUtil.CanHandleCallback(oauth.RedirectUrl, uri))
            {
                return(false);
            }

            IOAuth2Account account         = null;
            var            accessTokenTask = Task.Run(async() =>
            {
                account = await oauth.ParseCallbackAsync <OAuth2Account>(uri);
            });

            accessTokenTask.Wait();

            if (account == null)
            {
                tcsAuth?.TrySetException(new Exception("Failed to parse server response."));
            }
            else
            {
                tcsAuth?.TrySetResult(account);
            }

            oauth       = null;
            authSession = null;

            return(true);
        }