Search code examples
c#google-apigoogle-analytics-apigoogle-api-dotnet-client

BaseClientService.Initializer not found in google api .in c#


I am not able to find these specific class BaseClientService.Initializer in google.API DLL. Actually, I am trying to fetch google analytics data using service account certificate, but when I create the service object, it requires IAuthenticator, here I need to create BaseClientService.Initializer object,

 string scopes = new string[] { AnalyticsService.Scopes.AnalyticsReadonly.GetStringValue() };
 ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer("[email protected]") {
                Scopes = scopes
            }.FromCertificate());
 var service = new AnalyticsService(new BaseClientService.Initializer()
            {
                 HttpClientInitializer = credential,
                ApplicationName = "Analytics API Sample",
            });

Here is reference link, which I follow http://www.daimto.com/google-drive-api-with-a-service-account/


Solution

  • That is a very old tutorial you should have downloaded the .json key file when you created your project in Google developer console. This code is more updated Google service account with Google Analytics.

    Gmail.com is not a valid service account email address. You might also like to read my Google developer for beginners service account tutorial.

    using Google.Apis.AnalyticsReporting.v4;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Services;
    using System;
    using System.IO;
    using System.Security.Cryptography.X509Certificates;
    
    namespace GoogleAnaltyics.V4
    {
        public class ServiceAccountJson
        {
            public string type { get; set; }
            public string project_id { get; set; }
            public string private_key_id { get; set; }
            public string private_key { get; set; }
            public string client_email { get; set; }
            public string client_id { get; set; }
            public string auth_uri { get; set; }
            public string token_uri { get; set; }
            public string auth_provider_x509_cert_url { get; set; }
            public string client_x509_cert_url { get; set; }
        }
    
    
        public class ServiceAccountAuthExample
        {
    
            /// <summary>
            /// Authenticating to Google using a Service account
            /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount
            /// </summary>
            /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com</param>
            /// <param name="serviceAccountCredentialFilePath">Location of the .p12 or Json Service account key file downloaded from Google Developer console https://console.developers.google.com</param>
            /// <returns>AnalyticsService used to make requests against the Analytics API</returns>
            public static AnalyticsReportingService AuthenticateServiceAccount(string serviceAccountEmail, string serviceAccountCredentialFilePath)
            {
                try
                {
                    if (string.IsNullOrEmpty(serviceAccountCredentialFilePath))
                        throw new Exception("Path to the .p12 service account credentials file is required.");
                    if (!File.Exists(serviceAccountCredentialFilePath))
                        throw new Exception("The service account credentials .p12 file does not exist at: " + serviceAccountCredentialFilePath);
                    if (string.IsNullOrEmpty(serviceAccountEmail))
                        throw new Exception("ServiceAccountEmail is required.");
    
                    // These are the scopes of permissions you need. It is best to request only what you need and not all of them
                    string[] scopes = new string[] { AnalyticsReportingService.Scope.Analytics };             // View your Google Analytics data
    
                    // For Json file
                    if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".json")
                    {
                        GoogleCredential credential;
                        using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read))
                        {
                            credential = GoogleCredential.FromStream(stream)
                                 .CreateScoped(scopes);
                        }
    
                        // Create the  Analytics service.
                        return new AnalyticsReportingService(new BaseClientService.Initializer()
                        {
                            HttpClientInitializer = credential,
                            ApplicationName = "Analytics Authentication Sample",
                        });
                    }
                    else if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".p12")
                    {   // If its a P12 file
    
                        var certificate = new X509Certificate2(serviceAccountCredentialFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
                        var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
                        {
                            Scopes = scopes
                        }.FromCertificate(certificate));
    
                        // Create the  Analytics service.
                        return new AnalyticsReportingService(new BaseClientService.Initializer()
                        {
                            HttpClientInitializer = credential,
                            ApplicationName = "Analytics Authentication Sample",
                        });
    
                    }
                    else
                    {
                        throw new Exception("Unsupported Service accounts credentials.");
                    }
    
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Create service account AnalyticsService failed" + ex.Message);
                    throw new Exception("CreateServiceAccountAnalyticsServiceFailed", ex);
                }
            }
    
            /// <summary>
            /// Authenticating to Google using a Service account
            /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount
            /// </summary>
            /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com</param>
            /// <param name="key">Key from with in json file   
            /// 
            /// Example:
            /// ServiceAccountAuth tmp = JsonConvert.DeserializeObject<ServiceAccountAuth>(File.ReadAllText(serviceAccountJsonPath));
            /// 
            /// </param>
            /// <returns>AnalyticsService used to make requests against the Analytics API</returns>
            public static AnalyticsReportingService AuthenticateServiceAccountFromKey(string serviceAccountEmail, string key)
            {
                try
                {
                    if (string.IsNullOrEmpty(key))
                        throw new Exception("Key is required.");
                    if (string.IsNullOrEmpty(serviceAccountEmail))
                        throw new Exception("ServiceAccountEmail is required.");
    
                    // These are the scopes of permissions you need. It is best to request only what you need and not all of them
                    string[] scopes = new string[] { AnalyticsReportingService.Scope.Analytics };             // View your Google Analytics data
    
    
                    var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
                    {
                        Scopes = scopes
                    }.FromPrivateKey(key));
    
    
                    // Create the  Analytics service.
                    return new AnalyticsReportingService(new BaseClientService.Initializer()
                    {
                        HttpClientInitializer = credential,
                        ApplicationName = "Analytics Authentication Sample",
                    });
    
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Create service account AnalyticsService failed" + ex.Message);
                    throw new Exception("CreateServiceAccountAnalyticsServiceFailed", ex);
                }
            }
    
        }
    }