public async Task <WebAuthenticatorResult> AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) { var url = webAuthenticatorOptions?.Url; var callbackUrl = webAuthenticatorOptions?.CallbackUrl; var packageName = Application.Context.PackageName; // Create an intent to see if the app developer wired up the callback activity correctly var intent = new Intent(Intent.ActionView); intent.AddCategory(Intent.CategoryBrowsable); intent.AddCategory(Intent.CategoryDefault); intent.SetPackage(packageName); intent.SetData(global::Android.Net.Uri.Parse(callbackUrl.OriginalString)); // Try to find the activity for the callback intent if (!PlatformUtils.IsIntentSupported(intent, packageName)) { throw new InvalidOperationException($"You must subclass the `{nameof(WebAuthenticatorCallbackActivity)}` and create an IntentFilter for it which matches your `{nameof(callbackUrl)}`."); } // Cancel any previous task that's still pending if (tcsResponse?.Task != null && !tcsResponse.Task.IsCompleted) { tcsResponse.TrySetCanceled(); } tcsResponse = new TaskCompletionSource <WebAuthenticatorResult>(); currentRedirectUri = callbackUrl; if (!(await StartCustomTabsActivity(url))) { // Fall back to opening the system-registered browser if necessary var urlOriginalString = url.OriginalString; var browserIntent = new Intent(Intent.ActionView, global::Android.Net.Uri.Parse(urlOriginalString)); Platform.CurrentActivity.StartActivity(browserIntent); } return(await tcsResponse.Task); }
public async Task <WebAuthenticatorResult> AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) { var url = webAuthenticatorOptions?.Url; var callbackUrl = webAuthenticatorOptions?.CallbackUrl; if (!AppInfo.VerifyHasUrlScheme(callbackUrl.Scheme)) { throw new InvalidOperationException("You must register your URL Scheme handler in your app's Info.plist!"); } // Cancel any previous task that's still pending if (tcsResponse?.Task != null && !tcsResponse.Task.IsCompleted) { tcsResponse.TrySetCanceled(); } tcsResponse = new TaskCompletionSource <WebAuthenticatorResult>(); redirectUri = callbackUrl; var scheme = redirectUri.Scheme; if (OperatingSystem.IsMacOSVersionAtLeast(10, 15)) {
public async Task <WebAuthenticatorResult> AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) { var url = webAuthenticatorOptions?.Url; var callbackUrl = webAuthenticatorOptions?.CallbackUrl; if (!IsUriProtocolDeclared(callbackUrl.Scheme)) { throw new InvalidOperationException($"You need to declare the windows.protocol usage of the protocol/scheme `{callbackUrl.Scheme}` in your AppxManifest.xml file"); } try { var r = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, url, callbackUrl); switch (r.ResponseStatus) { case WebAuthenticationStatus.Success: // For GET requests this is a URI: var resultUri = new Uri(r.ResponseData.ToString()); return(new WebAuthenticatorResult(resultUri)); case WebAuthenticationStatus.UserCancel: throw new TaskCanceledException(); case WebAuthenticationStatus.ErrorHttp: throw new HttpRequestException("Error: " + r.ResponseErrorDetail); default: throw new Exception("Response: " + r.ResponseData.ToString() + "\nStatus: " + r.ResponseStatus); } } catch (FileNotFoundException) { throw new TaskCanceledException(); } }
public static Task <WebAuthenticatorResult> AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) => Current.AuthenticateAsync(webAuthenticatorOptions);
public async Task <WebAuthenticatorResult> AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) { var url = webAuthenticatorOptions?.Url; var callbackUrl = webAuthenticatorOptions?.CallbackUrl; var prefersEphemeralWebBrowserSession = webAuthenticatorOptions?.PrefersEphemeralWebBrowserSession ?? false; if (!VerifyHasUrlSchemeOrDoesntRequire(callbackUrl.Scheme)) { throw new InvalidOperationException("You must register your URL Scheme handler in your app's Info.plist."); } // Cancel any previous task that's still pending if (tcsResponse?.Task != null && !tcsResponse.Task.IsCompleted) { tcsResponse.TrySetCanceled(); } tcsResponse = new TaskCompletionSource <WebAuthenticatorResult>(); redirectUri = callbackUrl; var scheme = redirectUri.Scheme; #if __IOS__ void AuthSessionCallback(NSUrl cbUrl, NSError error) { if (error == null) { OpenUrlCallback(cbUrl); } else if (error.Domain == asWebAuthenticationSessionErrorDomain && error.Code == asWebAuthenticationSessionErrorCodeCanceledLogin) { tcsResponse.TrySetCanceled(); } else if (error.Domain == sfAuthenticationErrorDomain && error.Code == sfAuthenticationErrorCanceledLogin) { tcsResponse.TrySetCanceled(); } else { tcsResponse.TrySetException(new NSErrorException(error)); } was = null; sf = null; } if (OperatingSystem.IsIOSVersionAtLeast(12, 0)) { was = new ASWebAuthenticationSession(WebUtils.GetNativeUrl(url), scheme, AuthSessionCallback); if (OperatingSystem.IsIOSVersionAtLeast(13, 0)) { var ctx = new ContextProvider(WindowStateManager.Default.GetCurrentUIWindow()); was.PresentationContextProvider = ctx; was.PrefersEphemeralWebBrowserSession = prefersEphemeralWebBrowserSession; } else if (prefersEphemeralWebBrowserSession) { ClearCookies(); } using (was) { was.Start(); return(await tcsResponse.Task); } } if (prefersEphemeralWebBrowserSession) { ClearCookies(); } if (OperatingSystem.IsIOSVersionAtLeast(11, 0)) { sf = new SFAuthenticationSession(WebUtils.GetNativeUrl(url), scheme, AuthSessionCallback); using (sf) { sf.Start(); return(await tcsResponse.Task); } } // This is only on iOS9+ but we only support 10+ in Essentials anyway var controller = new SFSafariViewController(WebUtils.GetNativeUrl(url), false) { Delegate = new NativeSFSafariViewControllerDelegate { DidFinishHandler = (svc) => { // Cancel our task if it wasn't already marked as completed if (!(tcsResponse?.Task?.IsCompleted ?? true)) { tcsResponse.TrySetCanceled(); } } }, }; currentViewController = controller; await WindowStateManager.Default.GetCurrentUIViewController().PresentViewControllerAsync(controller, true); #else var opened = UIApplication.SharedApplication.OpenUrl(url); if (!opened) { tcsResponse.TrySetException(new Exception("Error opening Safari")); } #endif return(await tcsResponse.Task); }
public async Task <WebAuthenticatorResult> AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) { var url = webAuthenticatorOptions?.Url; var callbackUrl = webAuthenticatorOptions?.CallbackUrl; var packageName = Application.Context.PackageName; // Create an intent to see if the app developer wired up the callback activity correctly var intent = new Intent(Intent.ActionView); intent.AddCategory(Intent.CategoryBrowsable); intent.AddCategory(Intent.CategoryDefault); intent.SetPackage(packageName); intent.SetData(global::Android.Net.Uri.Parse(callbackUrl.OriginalString)); // Try to find the activity for the callback intent if (!PlatformUtils.IsIntentSupported(intent, packageName)) { throw new InvalidOperationException($"You must subclass the `{nameof(WebAuthenticatorCallbackActivity)}` and create an IntentFilter for it which matches your `{nameof(callbackUrl)}`."); } // Cancel any previous task that's still pending if (tcsResponse?.Task != null && !tcsResponse.Task.IsCompleted) { tcsResponse.TrySetCanceled(); } tcsResponse = new TaskCompletionSource <WebAuthenticatorResult>(); currentRedirectUri = callbackUrl; var parentActivity = ActivityStateManager.Default.GetCurrentActivity(true); var customTabsActivityManager = CustomTabsActivityManager.From(parentActivity); try { if (await BindServiceAsync(customTabsActivityManager)) { var customTabsIntent = new CustomTabsIntent.Builder(customTabsActivityManager.Session) .SetShowTitle(true) .Build(); customTabsIntent.Intent.SetData(global::Android.Net.Uri.Parse(url.OriginalString)); WebAuthenticatorIntermediateActivity.StartActivity(parentActivity, customTabsIntent.Intent); } else { // Fall back to opening the system browser if necessary var browserIntent = new Intent(Intent.ActionView, global::Android.Net.Uri.Parse(url.OriginalString)); ActivityStateManager.Default.GetCurrentActivity().StartActivity(browserIntent); } return(await tcsResponse.Task); } finally { try { customTabsActivityManager.Client?.Dispose(); } finally { } } }
public Task <WebAuthenticatorResult> AuthenticateAsync(WebAuthenticatorOptions webAuthenticatorOptions) => throw ExceptionUtils.NotSupportedOrImplementedException;