Utilisez l’API Google Analytics pour afficher des informations en C #

Je cherchais une bonne solution tout au long de la journée, mais Google évolue si vite que je ne trouve rien qui fonctionne. Ce que je veux faire est que, j’ai une application Web qui a une section admin où l’utilisateur doit être connecté pour voir les informations. Dans cette section, je souhaite afficher certaines données de GA, comme les pages vues pour certaines URL spécifiques. Comme ce ne sont pas les informations utilisateur que je montre mais les utilisateurs de Google Analytics, je veux connecter des informations (nom d’utilisateur / mot de passe ou APIKey), mais je ne peux pas savoir comment. Tous les exemples que j’ai trouvés utilisent OAuth2 (ce qui, si je comprends bien, demandera au visiteur de se connecter via Google).

Ce que j’ai trouvé jusqu’à présent:

  • Bibliothèque cliente officielle de Google pour .Net: http://code.google.com/p/google-api-dotnet-client/ , aucun exemple pour GA
  • aide des développeurs officiels: https://developers.google.com/analytics/
  • une autre question avec le code sur SO: Google Analytics API – Récupérer par programme des vues de page côté serveur mais je reçois un 403 lorsque j’essaie de m’authentifier
  • certaines sources qui accèdent à l’API: http://www.reimers.dk/jacob-reimers-blog/added-google-analytics-reader-for-net ont téléchargé la source mais je n’arrive pas à comprendre comment cela fonctionne
  • cette autre question sur SO: Google Analytics Access avec C # mais cela n’aide pas
  • tout en écrivant cela, ils me suggèrent cette ancienne ancienne API Google Analytics et .Net …

Peut-être que je suis juste fatigué et que demain, il sera facile de trouver une solution, mais maintenant j’ai besoin d’aide!

Merci

J’ai fait beaucoup de recherches et finalement, j’ai cherché du code à partir de plusieurs endroits, puis j’ai intégré ma propre interface pour trouver la solution suivante. Je ne sais pas si les gens collent leur code entier ici, mais je suppose pourquoi ne pas sauver tout le monde le temps 🙂

Pré-requirejs, vous devrez installer Google.GData.Client et google.gdata.analytics package / dll.

C’est la classe principale qui fait le travail.

namespace Utilities.Google { public class Analytics { private readonly Ssortingng ClientUserName; private readonly Ssortingng ClientPassword; private readonly Ssortingng TableID; private AnalyticsService analyticsService; public Analytics(ssortingng user, ssortingng password, ssortingng table) { this.ClientUserName = user; this.ClientPassword = password; this.TableID = table; // Configure GA API. analyticsService = new AnalyticsService("gaExportAPI_acctSample_v2.0"); // Client Login Authorization. analyticsService.setUserCredentials(ClientUserName, ClientPassword); } ///  /// Get the page views for a particular page path ///  ///  ///  ///  /// make this false if the pagePath is a regular expression ///  public int GetPageViewsForPagePath(ssortingng pagePath, DateTime startDate, DateTime endDate, bool isPathAbsolute = true) { int output = 0; // GA Data Feed query uri. Ssortingng baseUrl = "https://www.google.com/analytics/feeds/data"; DataQuery query = new DataQuery(baseUrl); query.Ids = TableID; //query.Dimensions = "ga:source,ga:medium"; query.Mesortingcs = "ga:pageviews"; //query.Segment = "gaid::-11"; var filterPrefix = isPathAbsolute ? "ga:pagepath==" : "ga:pagepath=~"; query.Filters = filterPrefix + pagePath; //query.Sort = "-ga:visits"; //query.NumberToResortingeve = 5; query.GAStartDate = startDate.ToSsortingng("yyyy-MM-dd", CultureInfo.InvariantCulture); query.GAEndDate = endDate.ToSsortingng("yyyy-MM-dd", CultureInfo.InvariantCulture); Uri url = query.Uri; DataFeed feed = analyticsService.Query(query); output = Int32.Parse(feed.Aggregates.Mesortingcs[0].Value); return output; } public Dictionary PageViewCounts(ssortingng pagePathRegEx, DateTime startDate, DateTime endDate) { // GA Data Feed query uri. Ssortingng baseUrl = "https://www.google.com/analytics/feeds/data"; DataQuery query = new DataQuery(baseUrl); query.Ids = TableID; query.Dimensions = "ga:pagePath"; query.Mesortingcs = "ga:pageviews"; //query.Segment = "gaid::-11"; var filterPrefix = "ga:pagepath=~"; query.Filters = filterPrefix + pagePathRegEx; //query.Sort = "-ga:visits"; //query.NumberToResortingeve = 5; query.GAStartDate = startDate.ToSsortingng("yyyy-MM-dd", CultureInfo.InvariantCulture); query.GAEndDate = endDate.ToSsortingng("yyyy-MM-dd", CultureInfo.InvariantCulture); Uri url = query.Uri; DataFeed feed = analyticsService.Query(query); var returnDictionary = new Dictionary(); foreach (var entry in feed.Ensortinges) returnDictionary.Add(((DataEntry)entry).Dimensions[0].Value, Int32.Parse(((DataEntry)entry).Mesortingcs[0].Value)); return returnDictionary; } } } 

Et c’est l’interface et l’implémentation avec lesquelles je m’emballe.

 namespace Utilities { public interface IPageViewCounter { int GetPageViewCount(ssortingng relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true); Dictionary PageViewCounts(ssortingng pagePathRegEx, DateTime startDate, DateTime endDate); } public class GooglePageViewCounter : IPageViewCounter { private ssortingng GoogleUserName { get { return ConfigurationManager.AppSettings["googleUserName"]; } } private ssortingng GooglePassword { get { return ConfigurationManager.AppSettings["googlePassword"]; } } private ssortingng GoogleAnalyticsTableName { get { return ConfigurationManager.AppSettings["googleAnalyticsTableName"]; } } private Analytics analytics; public GooglePageViewCounter() { analytics = new Analytics(GoogleUserName, GooglePassword, GoogleAnalyticsTableName); } #region IPageViewCounter Members public int GetPageViewCount(ssortingng relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true) { int output = 0; try { output = analytics.GetPageViewsForPagePath(relativeUrl, startDate, endDate, isPathAbsolute); } catch (Exception ex) { Logger.Error(ex); } return output; } public Dictionary PageViewCounts(ssortingng pagePathRegEx, DateTime startDate, DateTime endDate) { var input = analytics.PageViewCounts(pagePathRegEx, startDate, endDate); var output = new Dictionary(); foreach (var item in input) { if (item.Key.Contains('&')) { ssortingng[] key = item.Key.Split(new char[] { '?', '&' }); ssortingng newKey = key[0] + "?" + key.FirstOrDefault(k => k.StartsWith("p=")); if (output.ContainsKey(newKey)) output[newKey] += item.Value; else output[newKey] = item.Value; } else output.Add(item.Key, item.Value); } return output; } #endregion } } 

Et maintenant, le rest est évident – vous devrez append les valeurs web.config à votre application config ou webconfig et appeler IPageViewCounter.GetPageViewCount

Il faut un peu de configuration côté google, mais en réalité c’est assez simple. Je vais énumérer étape par étape.

Vous devez d’abord créer une application dans la console Google Cloud et activer l’API Analytics.

  • Accédez à http://code.google.com/apis/console.
  • Sélectionnez le menu déroulant et créez un projet si vous n’en avez pas déjà un
  • Une fois le projet créé, cliquez sur services
  • À partir de là, activez l’API Analytics

Maintenant que l’API Analytics est activée, l’étape suivante consistera à activer un compte de service pour accéder aux profils / sites d’parsing souhaités. Le compte de service vous permettra de vous connecter sans avoir à demander à un utilisateur des informations d’identification.

  • Accédez à http://code.google.com/apis/console et sélectionnez le projet que vous avez créé à partir du menu déroulant.
  • Ensuite, allez dans la section “Accès API” et cliquez sur le bouton “Créer un autre identifiant client”.
  • Dans la fenêtre Créer un ID client, choisissez le compte de service et cliquez sur Créer un identifiant client.
  • Téléchargez la clé publique pour ce compte si le téléchargement ne démarre pas automatiquement. Vous en aurez besoin ultérieurement lorsque vous coderez pour l’autorisation.
  • Avant de quitter, copiez l’adresse e-mail générée automatiquement par les comptes de service car vous en aurez besoin à l’étape suivante. L’e-mail du client ressemble à @ developer.gserviceaccount.com

Maintenant que nous avons un compte de service, vous devez autoriser ce compte de service à accéder à vos profils / sites dans Google Analytics.

  • Connectez-vous à Google Analytics.
  • Une fois connecté, cliquez sur le bouton Admin situé au bas de l’écran.
  • Dans Admin, cliquez sur la liste déroulante du compte et sélectionnez le compte / site auquel vous souhaitez que votre compte de service puisse accéder, puis cliquez sur «Gestion des utilisateurs» dans la section compte.
  • Entrez l’adresse électronique générée pour votre compte de service et donnez-lui la permission de lire et d’parsingr.
  • Répétez ces étapes pour tout autre compte / site auquel vous souhaitez que votre service ait access.

Maintenant que la configuration est effectuée pour que le compte de service puisse accéder à Google Analytics via l’API, nous pouvons commencer à coder.

Obtenez ce paquet de NuGet:

Bibliothèque de clients Google.Apis.Analytics.v3

Ajoutez ces utilisations:

 using Google.Apis.Analytics.v3; using Google.Apis.Analytics.v3.Data; using Google.Apis.Services; using System.Security.Cryptography.X509Certificates; using Google.Apis.Auth.OAuth2; using System.Collections.Generic; using System.Linq; 

Certaines choses à noter sont.

  • Le keyPath est le chemin d’access au fichier de clés que vous avez téléchargé avec une extension de fichier .p12.
  • Le accountEmailAddress est le courrier électronique que nous avons reçu plus tôt.
  • Scope est un Enum dans la classe Google.Apis.Analytics.v3.AnalyticService qui dicte l’URL à utiliser pour autoriser (ex: AnalyticsService.Scope.AnalyticsReadonly ).
  • Le nom de l’application est un nom de votre choix qui indique à l’API Google ce qui y accède (alias: cela peut être ce que vous choisissez).

Le code pour effectuer certains appels de base est le suivant.

 public class GoogleAnalyticsAPI { public AnalyticsService Service { get; set; } public GoogleAnalyticsAPI(ssortingng keyPath, ssortingng accountEmailAddress) { var certificatee = new X509Certificate2(keyPath, "notasecret", X509KeyStorageFlags.Exportable); var credentials = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(accountEmailAddress) { Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly } }.FromCertificate(certificatee)); Service = new AnalyticsService(new BaseClientService.Initializer() { HttpClientInitializer = credentials, ApplicationName = "WorthlessVariable" }); } public AnalyticDataPoint GetAnalyticsData(ssortingng profileId, ssortingng[] dimensions, ssortingng[] mesortingcs, DateTime startDate, DateTime endDate) { AnalyticDataPoint data = new AnalyticDataPoint(); if (!profileId.Contains("ga:")) profileId = ssortingng.Format("ga:{0}", profileId); //Make initial call to service. //Then check if a next link exists in the response, //if so parse and call again using start index param. GaData response = null; do { int startIndex = 1; if (response != null && !ssortingng.IsNullOrEmpty(response.NextLink)) { Uri uri = new Uri(response.NextLink); var paramerters = uri.Query.Split('&'); ssortingng s = paramerters.First(i => i.Contains("start-index")).Split('=')[1]; startIndex = int.Parse(s); } var request = BuildAnalyticRequest(profileId, dimensions, mesortingcs, startDate, endDate, startIndex); response = request.Execute(); data.ColumnHeaders = response.ColumnHeaders; data.Rows.AddRange(response.Rows); } while (!ssortingng.IsNullOrEmpty(response.NextLink)); return data; } private DataResource.GaResource.GetRequest BuildAnalyticRequest(ssortingng profileId, ssortingng[] dimensions, ssortingng[] mesortingcs, DateTime startDate, DateTime endDate, int startIndex) { DataResource.GaResource.GetRequest request = Service.Data.Ga.Get(profileId, startDate.ToSsortingng("yyyy-MM-dd"), endDate.ToSsortingng("yyyy-MM-dd"), ssortingng.Join(",", mesortingcs)); request.Dimensions = ssortingng.Join(",", dimensions); request.StartIndex = startIndex; return request; } public IList GetAvailableProfiles() { var response = Service.Management.Profiles.List("~all", "~all").Execute(); return response.Items; } public class AnalyticDataPoint { public AnalyticDataPoint() { Rows = new List>(); } public IList ColumnHeaders { get; set; } public List> Rows { get; set; } } } 

Autres liens utiles:

Analytic API Explorer – API de requête à partir du Web

Analytic API Explorer version 2 – API de requête à partir du Web

Référence des dimensions et des mésortingques

J’espère que cela aidera quelqu’un à essayer de le faire à l’avenir.

J’espérais juste append un commentaire à la réponse pour la version bêta v3, mais les points de représentation ne le permettent pas. Cependant, j’ai pensé que ce serait bien que d’autres aient cette information, alors voici:

 using Google.Apis.Authentication.OAuth2; using Google.Apis.Authentication.OAuth2.DotNetOpenAuth; using System.Security.Cryptography.X509Certificates; using Google.Apis.Services; 

Ces espaces de nom sont utilisés dans tout le code de cet article. Je souhaite toujours que les gens affichent plus souvent des espaces de nom, il me semble que je passe beaucoup de temps à les chercher. J’espère que cela permet à quelques personnes de gagner quelques minutes de travail.

Cette réponse s’adresse à ceux d’entre vous qui souhaitent accéder à votre propre compte Google Analytics et souhaitent utiliser la nouvelle API Analytics Reporting v4 .

J’ai récemment écrit un article sur la façon d’obtenir des données Google Analytics à l’aide de C #. Lire ici pour tous les détails.

Vous devez d’abord choisir entre vous connecter avec OAuth2 ou un compte de service. Je suppose que vous possédez le compte Google Analytics. Vous devez donc créer une “clé de compte de service” à partir de la page Informations d’ identification des API Google.

Une fois que vous créez cela, téléchargez le fichier JSON et placez-le dans votre projet (je mets le mien dans mon dossier App_Data ).

Ensuite, installez le package Google.Apis.AnalyticsReporting.v4 Nuget. Installez également Json.NET de Newtonsoft .

Inclure cette classe quelque part dans votre projet:

 public class PersonalServiceAccountCred { public ssortingng type { get; set; } public ssortingng project_id { get; set; } public ssortingng private_key_id { get; set; } public ssortingng private_key { get; set; } public ssortingng client_email { get; set; } public ssortingng client_id { get; set; } public ssortingng auth_uri { get; set; } public ssortingng token_uri { get; set; } public ssortingng auth_provider_x509_cert_url { get; set; } public ssortingng client_x509_cert_url { get; set; } } 

Et voici ce que vous attendiez: un exemple complet!

 ssortingng keyFilePath = Server.MapPath("~/App_Data/Your-API-Key-Filename.json"); ssortingng json = System.IO.File.ReadAllText(keyFilePath); var cr = JsonConvert.DeserializeObject(json); var xCred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(cr.client_email) { Scopes = new[] { AnalyticsReportingService.Scope.Analytics } }.FromPrivateKey(cr.private_key)); using (var svc = new AnalyticsReportingService( new BaseClientService.Initializer { HttpClientInitializer = xCred, ApplicationName = "[Your Application Name]" }) ) { // Create the DateRange object. DateRange dateRange = new DateRange() { StartDate = "2017-05-01", EndDate = "2017-05-31" }; // Create the Mesortingcs object. Mesortingc sessions = new Mesortingc { Expression = "ga:sessions", Alias = "Sessions" }; //Create the Dimensions object. Dimension browser = new Dimension { Name = "ga:browser" }; // Create the ReportRequest object. ReportRequest reportRequest = new ReportRequest { ViewId = "[A ViewId in your account]", DateRanges = new List() { dateRange }, Dimensions = new List() { browser }, Mesortingcs = new List() { sessions } }; List requests = new List(); requests.Add(reportRequest); // Create the GetReportsRequest object. GetReportsRequest getReport = new GetReportsRequest() { ReportRequests = requests }; // Call the batchGet method. GetReportsResponse response = svc.Reports.BatchGet(getReport).Execute(); } 

Nous commençons par désérialiser les informations de clé du compte de service à partir du fichier JSON et les convertissons en un object PersonalServiceAccountCred . Ensuite, nous créons le ServiceAccountCredential et nous nous connectons à Google via le service AnalyticsReportingService . En utilisant ce service, nous préparons ensuite des filtres de base pour passer à l’API et envoyer la demande.

Il est probablement préférable de définir un point d’arrêt sur la ligne où la variable de response est déclarée, appuyez une fois sur F10, puis placez le curseur sur la variable pour afficher les données disponibles dans la réponse.

J’ai configuré quelque chose de très similaire à la réponse ci-dessus dans un package nuGet. Il effectue les opérations suivantes: – se connecte à un “compte de service” que vous avez configuré dans la console API – extrait toutes les données Google Analytics de votre choix – affiche ces données à l’aide de l’API Google Graphiques et les modifie facilement . Vous pouvez en voir plus ici: https://www.nuget.org/packages/GoogleAnalytics.GoogleCharts.NET/ .

J’espère que google fournira la documentation appropriée un jour. Ici, je liste toutes les étapes pour intégrer l’authentification côté serveur de Google Analytics dans ASP.NET C #.

Étape 1: Créer un projet dans la console Google

Accédez au lien https://console.developers.google.com/iam-admin/projects et créez un projet en cliquant sur le bouton “Créer un projet” et indiquez le nom du projet dans la fenêtre contextuelle et soumettez-le.

Étape 2: créer des informations d’identification et un compte de service

Après la création du projet, vous serez redirigé vers la page “API Manager”. Cliquez sur les informations d’identification et appuyez sur le bouton “Créer des informations d’identification”. sélectionnez “clé de compte de service” dans la liste déroulante, vous serez redirigé vers la page suivante. Dans le menu déroulant du compte de service, sélectionnez “Nouveau compte de service”. Indiquez le nom du compte de service et téléchargez la clé p12. Il aura l’extension p12. vous obtiendrez un popup avec un mot de passe ” notasecret ” qui est par défaut et votre clé privée sera téléchargée.

Étape 3: Créer un ID client 0auth

Cliquez sur le menu déroulant “créer des identifiants” et sélectionnez “0auth ID client”. Vous serez redirigé vers l’onglet “0auth consent screen”. fournir un nom aléatoire dans la zone de texte du nom du projet. Sélectionnez le type d’application comme “Application Web” et cliquez sur le bouton Créer. Copiez l’ID client généré dans un bloc-notes.

Étape 4: Activer les API

Sur le côté gauche, cliquez sur l’onglet “Aperçu” et sélectionnez “API activées” dans l’onglet horizontal. Dans la barre de recherche, recherchez “API Analytics”, cliquez sur le menu déroulant et appuyez sur le bouton “Activer”. Recherchez à nouveau “Analytics Reporting V4” et activez-le.

Étape 5: Installez les paquets nuget

Dans Visual Studio, sélectionnez Outils> Gestionnaire de packages Nuget> Console du gestionnaire de packages. Copiez collez le code ci-dessous dans la console pour installer les packages nuget.

Paquet d’installation Google.Apis.Analytics.v3

Package d’installation DotNetOpenAuth.Core -Version 4.3.4.13329

Les deux paquets ci-dessus sont Google Analytics et DotNetOpenAuth.

Étape 6: Fournir une autorisation «Afficher et parsingr» sur le compte de service

Accédez au compte Google Analytics et cliquez sur l’onglet “Admin” et sélectionnez “Gestion des utilisateurs” dans les menus de gauche, sélectionnez un domaine pour lequel vous souhaitez accéder aux données analytiques, puis insérez l’identifiant de messagerie du compte de service et sélectionnez “Lire et parsingr” à partir du menu déroulant. L’identifiant de messagerie du compte de service ressemble à ex: googleanalytics@googleanalytics.iam.gserviceaccount.com .

Code de travail

CODE AVANT:

Copiez et collez le script d’intégration ci-dessous dans votre frontal ou vous pouvez également obtenir ce code à partir de la page de documentation de Google Analytics.

   

Collez le code ci-dessous dans la balise body de votre page frontale.

   

Vous pouvez également obtenir votre ID de vue sur https://ga-dev-tools.appspot.com/account-explorer/

CODE DE FIN DE RETOUR:

  using System; using System.Linq; using System.Collections.Generic; using System.Collections.Specialized; using System.Web.Script.Serialization; using System.Net; using System.Text; using Google.Apis.Analytics.v3; using Google.Apis.Analytics.v3.Data; using Google.Apis.Services; using System.Security.Cryptography.X509Certificates; using Google.Apis.Auth.OAuth2; using Google.Apis.Util; using DotNetOpenAuth.OAuth2; using System.Security.Cryptography; namespace googleAnalytics { public partial class api : System.Web.UI.Page { public const ssortingng SCOPE_ANALYTICS_READONLY = "https://www.googleapis.com/auth/analytics.readonly"; ssortingng ServiceAccountUser = "googleanalytics@googleanalytics.iam.gserviceaccount.com"; //service account email ID ssortingng keyFile = @"D:\key.p12"; //file link to downloaded key with p12 extension protected void Page_Load(object sender, EventArgs e) { ssortingng Token = Convert.ToSsortingng(GetAccessToken(ServiceAccountUser, keyFile, SCOPE_ANALYTICS_READONLY)); accessToken.Value = Token; var certificatee = new X509Certificate2(keyFile, "notasecret", X509KeyStorageFlags.Exportable); var credentials = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(ServiceAccountUser) { Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly } }.FromCertificate(certificatee)); var service = new AnalyticsService(new BaseClientService.Initializer() { HttpClientInitializer = credentials, ApplicationName = "Google Analytics API" }); ssortingng profileId = "ga:53861036"; ssortingng startDate = "2016-04-01"; ssortingng endDate = "2016-04-30"; ssortingng mesortingcs = "ga:sessions,ga:users,ga:pageviews,ga:bounceRate,ga:visits"; DataResource.GaResource.GetRequest request = service.Data.Ga.Get(profileId, startDate, endDate, mesortingcs); GaData data = request.Execute(); List ColumnName = new List(); foreach (var h in data.ColumnHeaders) { ColumnName.Add(h.Name); } List values = new List(); foreach (var row in data.Rows) { foreach (var item in row) { values.Add(Convert.ToDouble(item)); } } values[3] = Math.Truncate(100 * values[3]) / 100; txtSession.Text = values[0].ToSsortingng(); txtUsers.Text = values[1].ToSsortingng(); txtPageViews.Text = values[2].ToSsortingng(); txtBounceRate.Text = values[3].ToSsortingng(); txtVisits.Text = values[4].ToSsortingng(); } public static dynamic GetAccessToken(ssortingng clientIdEMail, ssortingng keyFilePath, ssortingng scope) { // certificatee var certificatee = new X509Certificate2(keyFilePath, "notasecret"); // header var header = new { typ = "JWT", alg = "RS256" }; // claimset var times = GetExpiryAndIssueDate(); var claimset = new { iss = clientIdEMail, scope = scope, aud = "https://accounts.google.com/o/oauth2/token", iat = times[0], exp = times[1], }; JavaScriptSerializer ser = new JavaScriptSerializer(); // encoded header var headerSerialized = ser.Serialize(header); var headerBytes = Encoding.UTF8.GetBytes(headerSerialized); var headerEncoded = Convert.ToBase64Ssortingng(headerBytes); // encoded claimset var claimsetSerialized = ser.Serialize(claimset); var claimsetBytes = Encoding.UTF8.GetBytes(claimsetSerialized); var claimsetEncoded = Convert.ToBase64Ssortingng(claimsetBytes); // input var input = headerEncoded + "." + claimsetEncoded; var inputBytes = Encoding.UTF8.GetBytes(input); // signature var rsa = certificatee.PrivateKey as RSACryptoServiceProvider; var cspParam = new CspParameters { KeyContainerName = rsa.CspKeyContainerInfo.KeyContainerName, KeyNumber = rsa.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2 }; var aescsp = new RSACryptoServiceProvider(cspParam) { PersistKeyInCsp = false }; var signatureBytes = aescsp.SignData(inputBytes, "SHA256"); var signatureEncoded = Convert.ToBase64Ssortingng(signatureBytes); // jwt var jwt = headerEncoded + "." + claimsetEncoded + "." + signatureEncoded; var client = new WebClient(); client.Encoding = Encoding.UTF8; var uri = "https://accounts.google.com/o/oauth2/token"; var content = new NameValueCollection(); content["assertion"] = jwt; content["grant_type"] = "urn:ietf:params:oauth:grant-type:jwt-bearer"; ssortingng response = Encoding.UTF8.GetSsortingng(client.UploadValues(uri, "POST", content)); var result = ser.Deserialize(response); object pulledObject = null; ssortingng token = "access_token"; if (result.ContainsKey(token)) { pulledObject = result[token]; } //return result; return pulledObject; } private static int[] GetExpiryAndIssueDate() { var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); var issueTime = DateTime.UtcNow; var iat = (int)issueTime.Subtract(utc0).TotalSeconds; var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds; return new[] { iat, exp }; } } } 

Une autre approche de travail

Ajouter le code ci-dessous dans ConfigAuth

  var googleApiOptions = new GoogleOAuth2AuthenticationOptions() { AccessType = "offline", // can use only if require ClientId = ClientId, ClientSecret = ClientSecret, Provider = new GoogleOAuth2AuthenticationProvider() { OnAuthenticated = context => { context.Identity.AddClaim(new Claim("Google_AccessToken", context.AccessToken)); if (context.RefreshToken != null) { context.Identity.AddClaim(new Claim("GoogleRefreshToken", context.RefreshToken)); } context.Identity.AddClaim(new Claim("GoogleUserId", context.Id)); context.Identity.AddClaim(new Claim("GoogleTokenIssuedAt", DateTime.Now.ToBinary().ToSsortingng())); var expiresInSec = 10000; context.Identity.AddClaim(new Claim("GoogleTokenExpiresIn", expiresInSec.ToSsortingng())); return Task.FromResult(0); } }, SignInAsAuthenticationType = DefaultAuthenticationTypes.ApplicationCookie }; googleApiOptions.Scope.Add("openid"); // Need to add for google+ googleApiOptions.Scope.Add("profile");// Need to add for google+ googleApiOptions.Scope.Add("email");// Need to add for google+ googleApiOptions.Scope.Add("https://www.googleapis.com/auth/analytics.readonly"); app.UseGoogleAuthentication(googleApiOptions); 

Ajouter le code ci-dessous, les espaces de nom et les références relatives

  using Google.Apis.Analytics.v3; using Google.Apis.Analytics.v3.Data; using Google.Apis.Auth.OAuth2; using Google.Apis.Auth.OAuth2.Flows; using Google.Apis.Auth.OAuth2.Responses; using Google.Apis.Services; using Microsoft.AspNet.Identity; using Microsoft.Owin.Security; using System; using System.Threading.Tasks; using System.Web; using System.Web.Mvc; public class HomeController : Controller { AnalyticsService service; public IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } } public async Task AccountList() { service = new AnalyticsService(new BaseClientService.Initializer() { HttpClientInitializer = await GetCredentialForApiAsync(), ApplicationName = "Analytics API sample", }); //Account List ManagementResource.AccountsResource.ListRequest AccountListRequest = service.Management.Accounts.List(); //service.QuotaUser = "MyApplicationProductKey"; Accounts AccountList = AccountListRequest.Execute(); return View(); } private async Task GetCredentialForApiAsync() { var initializer = new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = new ClientSecrets { ClientId = ClientId, ClientSecret = ClientSecret, }, Scopes = new[] { "https://www.googleapis.com/auth/analytics.readonly" } }; var flow = new GoogleAuthorizationCodeFlow(initializer); var identity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ApplicationCookie); if (identity == null) { Redirect("/Account/Login"); } var userId = identity.FindFirstValue("GoogleUserId"); var token = new TokenResponse() { AccessToken = identity.FindFirstValue("Google_AccessToken"), RefreshToken = identity.FindFirstValue("GoogleRefreshToken"), Issued = DateTime.FromBinary(long.Parse(identity.FindFirstValue("GoogleTokenIssuedAt"))), ExpiresInSeconds = long.Parse(identity.FindFirstValue("GoogleTokenExpiresIn")), }; return new UserCredential(flow, userId, token); } } 

Ajoutez ceci dans Application_Start () dans Global.asax

  AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;