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); }
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); }