Как войти в Google API с учетной записью службы на С# - Недействительные учетные данные

Я избиваю себя чертовски, пытаясь получить простую учетную запись acccount для работы на С#, в Google API и Google Analytics. Моя компания уже получает данные в Google Analytics, и я могу запрашивать информацию с помощью своего проводника запросов, но начало работы в .NET некуда никуда. Я использую json файл с Google с помощью PKI, поскольку в документации говорится, что такая учетная запись службы является надлежащим образом для связи между компьютером и компьютером с API Googla. Снайпер кода:

public static GoogleCredential _cred;
public static string _exePath;

static void Main(string[] args) {
    _exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace(@"file:\", "");
    var t = Task.Run(() => Run());
    t.Wait();
}

private static async Task Run() {
    try {
        // Get active credential
        using (var stream = new FileStream(_exePath + "\\Default-GASvcAcct-508d097b0bff.json", FileMode.Open, FileAccess.Read)) {
            _cred = GoogleCredential.FromStream(stream);
        }
        if (_cred.IsCreateScopedRequired) {
        _cred.CreateScoped(new string[] { AnalyticsService.Scope.Analytics });
        }
        // Create the service
        AnalyticsService service = new AnalyticsService(
            new BaseClientService.Initializer() {
                HttpClientInitializer = _cred,
            });
        var act1 = service.Management.Accounts.List().Execute(); // blows-up here

Все компилируется отлично, но когда он попадает в оператор Execute(), возникает ошибка GoogleApiException:

[Недопустимые учетные данные] Местоположение [Авторизация - заголовок] Причина [authError] Домен [глобальный]

Что мне не хватает?

Ответ 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"
}