Невозможно сгенерировать клиентскую часть Google Analytics DataChart с маркером учетной записи службы (ошибка неверных учетных данных) - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь реализовать Графики Google Analytics через их API Javascript, как пример на их сайте ссылка .

Но я продолжаю получать "401 неверных учетных данных" каждый раз, когда я пытаюсь выполнить gapi.analytics.googleCharts.DataChart

Я получаю серверную часть токена доступа (C #), используя следующий код с данными из JSON, сгенерированными для учетной записи службы

var cred = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(clientId)
    {
        Scopes = new[] { AnalyticsReportingService.Scope.AnalyticsReadonly },
        User = clientEmail,
        ProjectId = "projectID"
    }.FromPrivateKey(privateKey));

var token = cred.GetAccessTokenForRequestAsync(authURI);
token.Wait();
var result = token.Result;
return result;

или (используя полную строку json, см. Также Примечание)

GoogleCredential cred;

var gCred = GoogleCredential.FromJson(json).UnderlyingCredential as
    ServiceAccountCredential;

var token = gCred.GetAccessTokenForRequestAsync("https://accounts.google.com/o/oauth2/auth");
return token.Result;

На стороне клиента

gapi.analytics.auth.authorize({
    'serverAuth': {
      'access_token': '{{ ACCESS_TOKEN_FROM_SERVICE_ACCOUNT }}'
    }
  });

проходит и с использованием gapi.analytics.auth.isAuthorized () возвращает true, используя любую из функций на стороне сервера, но не удается при попытке вызвать

  var dataChart1 = new gapi.analytics.googleCharts.DataChart(queryJson);
  dataChart1.execute();

возвращает 401 «Недействительные учетные данные», запрос на стороне сервера возвращает значения очень хорошо, поэтому я думаю, что пользовательские разрешения не проблема

ПРИМЕЧАНИЕ. Используя тот же код, что и второй (генерируя учетные данные, используя строку json без приведения в качестве ServiceAccountCredential), я могу получить данные со стороны сервера API

cred = gCred.CreateScoped(scopes);

using (var reportingService = new AnalyticsReportingService(new BaseClientService.Initializer
    {
        HttpClientInitializer = cred
    }))
...
var getReportsRequest = new GetReportsRequest
{
    ReportRequests = new List<ReportRequest> { reportRequest }
};
var batchRequest = reportingService.Reports.BatchGet(getReportsRequest);

var response = batchRequest.Execute(); //This returns a response object with all the data I need

1 Ответ

0 голосов
/ 16 ноября 2018

Если у кого-то есть такая же проблема:

Вам необходимо использовать GoogleCredential.GetApplicationDefault () для создания объекта Credential, в случае Analytics вы должны получить что-то вроде этого

var credential = GoogleCredential.GetApplicationDefault().CreateScoped(AnalyticsReportingService.Scope.AnalyticsReadonly);

Это позволит получить файл json из Переменных среды в Windows, поэтому вам нужно установить GOOGLE_APPLICATION_CREDENTIALS , указав путь к json в качестве системной переменной.

Инициализировать службу и установить переменную службы

using (var reportingService = new AnalyticsReportingService(new BaseClientService.Initializer { HttpClientInitializer = credential }))
{
  var serviceCredential = cred.UnderlyingCredential as ServiceAccountCredential;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...