Ответ 1
Похоже, что GoogleAnalytics не может использовать общий GoogleCredential
и интерпретировать его как ServiceAccountCredential
(даже если он подтвержден, в то же время, что он действительно относится к этому типу). Таким образом, вам нужно создать ServiceAccountCredential
трудный путь. Также жаль, что GoogleCredential
не раскрывает различные свойства учетных данных, поэтому мне пришлось создавать свои собственные.
Я использовал генератор класса JSON С# в http://jsonclassgenerator.codeplex.com/ для создания "личного" объекта ServiceAccountCredential с использованием библиотеки JSON, которая является автоматической частью API Google. (Newtonsoft.Json), извлек необходимые части загруженного json файла учетной записи службы, чтобы создать необходимые учетные данные, используя свои свойства электронной почты и частного ключа. Передача подлинного ServiceAccountCredential
в конструктор службы GoogleAnalytics приводит к успешному входу в систему и доступу к ресурсам, разрешенным для аккаунтов.
Пример рабочего кода ниже:
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Analytics.v3;
using Newtonsoft.Json;
.
.
.
try
{
// Get active credential
string credPath = _exePath + @"\Private-67917519b23f.json";
var json = File.ReadAllText(credPath);
var cr = JsonConvert.DeserializeObject<PersonalServiceAccountCred>(json); // "personal" service account credential
// Create an explicit ServiceAccountCredential credential
var xCred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(cr.ClientEmail)
{
Scopes = new[] {
AnalyticsService.Scope.AnalyticsManageUsersReadonly,
AnalyticsService.Scope.AnalyticsReadonly
}
}.FromPrivateKey(cr.PrivateKey));
// Create the service
AnalyticsService service = new AnalyticsService(
new BaseClientService.Initializer()
{
HttpClientInitializer = xCred,
}
);
// some calls to Google API
var act1 = service.Management.Accounts.List().Execute();
var actSum = service.Management.AccountSummaries.List().Execute();
var resp1 = service.Management.Profiles.List(actSum.Items[0].Id, actSum.Items[0].WebProperties[0].Id).Execute();
Некоторые могут задаться вопросом, как выглядит учетная запись учетной записи службы Google с помощью PKI (Private Key). Из Менеджера API Google API (IAM и Admin) в https://console.developers.google.com/iam-admin/projects выберите соответствующий проект (у вас есть хотя бы один из них). Теперь выберите Учетные записи службы (слева) и СОЗДАТЬ СЕРВИСНЫЙ СЧЕТ в верхней части экрана. Заполните имя, установите флажок Обрезать новый закрытый ключ, затем нажмите Создать. Google приведет к автоматической загрузке файла JSON, который выглядит примерно так:
{
"type": "service_account",
"project_id": "atomic-acrobat-135",
"private_key_id": "508d097b0bff9e90b8d545f984888b0ef31",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIE...o/0=\n-----END PRIVATE KEY-----\n",
"client_email": "[email protected]",
"client_id": "1123573016559832",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-analytics%40atomic-acrobat-135923.iam.gserviceaccount.com"
}