Я пытаюсь реализовать Графики 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