Exemple #1
0
        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);
            }

        }
Exemple #2
0
        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
            });
        }
Exemple #4
0
        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);
            }
        }
Exemple #5
0
 static async void LogOut(string clientId, string clientsecret)
 {
     googleSignInProvider?.Canceled();
     googleSignInProvider = new GoogleSignInProvider();
     await googleSignInProvider.SignOut(clientId);
 }