static async void Login(WebAuthenticator authenticator) { var currentActivity = activityLifecycle.CurrentActivity; var googleAuth = authenticator as GoogleAuthenticator; googleSignInProvider = new GoogleSignInProvider(); GoogleSignInResult result = null; try { result = await googleSignInProvider.Authenticate(GoogleAuthenticator.GetGoogleClientId (googleAuth.ClientId), googleAuth.Scope.ToArray ()); if (result == null || result.Status.IsCanceled || result.Status.IsInterrupted) { googleAuth.OnCancelled(); return; } if (!result.IsSuccess) { googleAuth.OnError(result.Status.StatusMessage); return; } //var accessToken = Android.Gms.Auth.GoogleAuthUtil.GetToken(currentActivity, result.SignInAccount.Email, string.Join (" ", tokenScopes)); var androidAccount = Android.Accounts.AccountManager.FromContext(currentActivity) ?.GetAccounts() ?.FirstOrDefault(a => a.Name?.Equals(result?.SignInAccount?.Email, StringComparison.InvariantCultureIgnoreCase) ?? false); var tokenScopes = googleAuth.Scope.Select(s => "oauth2:" + s); var accessToken = await Task.Run(() => { return Android.Gms.Auth.GoogleAuthUtil.GetToken(currentActivity, androidAccount, string.Join (" ", tokenScopes)); }); googleAuth.OnRecievedAuthCode (accessToken); } catch (Exception ex) { googleAuth.OnError(ex.Message); } }
static async void Login(WebAuthenticator authenticator) { var currentActivity = activityLifecycle.CurrentActivity; var googleAuth = authenticator as GoogleAuthenticator; googleSignInProvider = new GoogleSignInProvider(); GoogleSignInResult result = null; try { result = await googleSignInProvider.Authenticate(GoogleAuthenticator.GetGoogleClientId(googleAuth.ClientId), googleAuth.Scope.ToArray()); if (result == null || result.Status.IsCanceled || result.Status.IsInterrupted) { googleAuth.OnCancelled(); return; } if (!result.IsSuccess) { googleAuth.OnError(result.Status.StatusMessage); return; } //var accessToken = Android.Gms.Auth.GoogleAuthUtil.GetToken(currentActivity, result.SignInAccount.Email, string.Join (" ", tokenScopes)); var androidAccount = Android.Accounts.AccountManager.FromContext(currentActivity) ?.GetAccounts() ?.FirstOrDefault(a => a.Name?.Equals(result?.SignInAccount?.Email, StringComparison.InvariantCultureIgnoreCase) ?? false); var tokenScopes = googleAuth.Scope.Select(s => "oauth2:" + s); var accessToken = await Task.Run(() => { return(Android.Gms.Auth.GoogleAuthUtil.GetToken(currentActivity, androidAccount, string.Join(" ", tokenScopes))); }); googleAuth.OnRecievedAuthCode(accessToken); } catch (Exception ex) { googleAuth.OnError(ex.Message); } }
public async Task <IAccount> AuthenticateAsync(IGoogleAuthOptions options) { googleSignInProvider = new GoogleSignInProvider(); GoogleSignInResult result = null; result = await googleSignInProvider.Authenticate(options); if (result == null || result.Status.IsCanceled || result.Status.IsInterrupted) { return(null); } if (!result.IsSuccess || result.SignInAccount == null) { // TODO: Report error return(null); } var acct = result.SignInAccount; var grantedScopes = new List <string>(); if (acct.GrantedScopes != null && acct.GrantedScopes.Any()) { grantedScopes.AddRange(acct.GrantedScopes.Select(s => s.ToString())); } Uri photoUrl = null; if (acct.PhotoUrl != null) { Uri.TryCreate(acct.PhotoUrl.ToString(), UriKind.Absolute, out photoUrl); } // Try and obtain an access token var activity = Plugin.SocialAuth.Droid.SocialAuth.CurrentActivity; var androidAccount = Android.Accounts.AccountManager.FromContext(activity) ?.GetAccounts() ?.FirstOrDefault(a => a.Name?.Equals(result?.SignInAccount?.Email, StringComparison.InvariantCultureIgnoreCase) ?? false); var tokenScopes = options.Scopes.Select(s => "oauth2:" + s); string accessToken = null; DateTime?accessTokenExpires = null; if (androidAccount != null) { // We must run this on a non-ui thread or google will throw an error accessToken = await Task.Run(() => { try { return(global::Android.Gms.Auth.GoogleAuthUtil.GetToken(activity, androidAccount, string.Join(" ", tokenScopes))); } catch { } return(null); }); // This token will be an offline token if (!string.IsNullOrEmpty(accessToken)) { accessTokenExpires = DateTime.MaxValue; } } return(new GoogleAccount { Id = acct.Id, IdToken = acct.IdToken, ServerAuthCode = acct.ServerAuthCode, AccessToken = accessToken, AccessTokenExpires = accessTokenExpires, DisplayName = acct.DisplayName, Email = acct.Email, FamilyName = acct.FamilyName, GivenName = acct.GivenName, GrantedScopes = grantedScopes, PhotoUri = photoUrl }); }
static async void Login(WebAuthenticator authenticator) { var currentActivity = activityLifecycle.CurrentActivity; var googleAuth = authenticator as GoogleAuthenticator; googleSignInProvider?.Canceled(); googleSignInProvider = new GoogleSignInProvider(); GoogleSignInResult result = null; try { result = await googleSignInProvider.Authenticate(googleAuth); if (result == null || result.Status.IsCanceled || result.Status.IsInterrupted) { googleAuth.OnCancelled(); return; } if (!result.IsSuccess) { //This is a cursed error. This means something is wrong with the tokens. Easiest to regenerate new Web ones if (result.Status.StatusCode == 12501) { googleAuth.OnError("Status Code 12501 (unknown) Your app signing or tokens are invalid."); } else { googleAuth.OnError(result.Status.StatusMessage ?? result.Status.ToString()); } return; } var gauth = authenticator as GoogleAuthenticator; gauth.IdToken = result?.SignInAccount?.IdToken; gauth.ServerToken = result?.SignInAccount?.ServerAuthCode; string accessToken; //Going to use standard OAuth Flow since we have a Secret if (googleAuth.ClientSecret != GoogleApi.NativeClientSecret) { accessToken = result.SignInAccount.ServerAuthCode; } else { var scopes = string.Join(" ", googleAuth.Scope); var tokenScopes = $"oauth2:{scopes}"; var androidAccount = result?.SignInAccount?.Account ?? Android.Accounts.AccountManager.FromContext(currentActivity) ?.GetAccounts() ?.FirstOrDefault(a => a.Name?.Equals(result?.SignInAccount?.Email, StringComparison.InvariantCultureIgnoreCase) ?? false); if (androidAccount == null) { accessToken = await Task.Run(() => { return(Android.Gms.Auth.GoogleAuthUtil.GetToken(currentActivity, result?.SignInAccount?.Email, tokenScopes)); }); } else { //Just rely on the native lib for refresh accessToken = await Task.Run(() => { return(Android.Gms.Auth.GoogleAuthUtil.GetToken(currentActivity, androidAccount, tokenScopes)); }); } } googleAuth.OnRecievedAuthCode(accessToken); } catch (Exception ex) { googleAuth.OnError(ex.Message); } }
static async void LogOut(string clientId, string clientsecret) { googleSignInProvider?.Canceled(); googleSignInProvider = new GoogleSignInProvider(); await googleSignInProvider.SignOut(clientId); }