Google Analytics API v3 で 「Error:"invalid_grant", Description:"", Uri:""」 エラーが発生する
このページのタグ:[C#] [Google Analytics API]
Google Analytics API v3 で 「Error:"invalid_grant", Description:"", Uri:""」 エラーが発生する場合の対処法です。

原因

いくつか原因が考えられますが、serviceAccountEmailが設定されていない場合のこのエラーが発生します。

エラーの発生するコード

コード

下記のコードを記述します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Services;

namespace GoogleAnalyticsPVGet
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      X509Certificate2 certificate = new X509Certificate2(@"apikey.p12", "notasecret", X509KeyStorageFlags.Exportable);

      string serviceAccountEmail = ""; //ここが空欄
      ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
      {
        Scopes = new[] { AnalyticsService.Scope.Analytics, AnalyticsService.Scope.AnalyticsReadonly }
      }
      .FromCertificate(certificate));

      AnalyticsService service = new AnalyticsService(new BaseClientService.Initializer
      {
        HttpClientInitializer = credential,
        ApplicationName = "sample app",
      });

      string date = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd");

      DataResource.GaResource.GetRequest request = service.Data.Ga.Get("ga:00000000", date, date, "ga:pageviews");

      GaData data = request.Execute();

      textBox1.Text += data.Rows[0][0];
    }
  }
}

対策

ServiceAccountCredential.Initializer()でサービスアカウントのIDを与えます。

      string serviceAccountEmail = "012345678901-abcdefghijklmnopqrstuvwxyz012345@developer.gserviceaccount.com";
      ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
      {
        Scopes = new[] { AnalyticsService.Scope.Analytics, AnalyticsService.Scope.AnalyticsReadonly }
      }
      .FromCertificate(certificate));
プライバシー    iPentecについて
iPentec all rights reserverd. (ISDC)