Выполните аутентификацию, чтобы использовать Google Таблицы с учетной записью службы вместо личной учетной записи в C # .NET.

У меня есть разработанное мной приложение, использующее несколько таблиц Google.

Мне удалось выяснить, как получить доступ к Google Sheets API, используя следующий код:

    UserCredential credential;
    using (var stream =
                  new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
    {
        string credPath = System.Environment.GetFolderPath(
            System.Environment.SpecialFolder.Personal);


        credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.Load(stream).Secrets,
            Scopes,
            "user",
            CancellationToken.None,
            new FileDataStore(credPath, true)).Result;
        Console.WriteLine("Credential file saved to: " + credPath);
    }
    // Create Google Sheets API service.
    var service = new SheetsService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = ApplicationName,
    });

Это приложение будет использовать еще несколько человек - но при первом запуске приложения оно просит их войти в Google, но их учетные записи не дают им соответствующего доступа.

Я думаю (поправьте меня, если я ошибаюсь) - использование учетной записи службы должно решить мою проблему и больше не предлагать пользователю «войти в систему», но все же позволяет моему приложению правильно читать / обновлять таблицы.

Я хотел бы взять свой существующий код и изменить его для использования учетной записи службы, но я не могу найти никакой хорошей документации о том, как это сделать. Я создал учетную запись службы, и файл ServiceAccount.json находится в том же месте, что и текущий файл client_secret.json, но я не уверен, что делать дальше.

Я попытался изменить код на:

    ServiceAccountCredential credential;
    //UserCredential credential;
    using (var stream =
        new FileStream("HelperServiceAccount.json", FileMode.Open, FileAccess.Read))
    {
        string credPath = System.Environment.GetFolderPath(
            System.Environment.SpecialFolder.Personal);


        credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.Load(stream).Secrets,
            Scopes,
            "user",
            CancellationToken.None,
            new FileDataStore(credPath, true)).Result;
            )
        Console.WriteLine("Credential file saved to: " + credPath);
    }
    // Create Google Sheets API service.
    var service = new SheetsService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = ApplicationName,
    });

Но не получается - учетная переменная выдает ошибку.

Любые идеи?


person Hanny    schedule 21.12.2016    source источник
comment
Вы можете проверить документ об использовании OAuth 2.0 для серверных приложений, это объясните, как правильно авторизовать сервисный аккаунт для доступа к Google Sheet API. Существует образец от nodejs, в котором можно использовать учетную запись службы для доступа к Sheets API. .   -  person Mr.Rebot    schedule 22.12.2016
comment
Наконец, попробуйте прочитать Использование API таблиц Google с использованием .NET, OAuth 2.0 и сервисный аккаунт, который поможет вам понять реализацию кода для C #. Надеюсь, это поможет.   -  person Mr.Rebot    schedule 22.12.2016
comment
Спасибо! Я думаю, что наткнулся на этот сайт во время некоторых своих путешествий по сети, хотя он имеет дело с файлами p12, а я работаю конкретно с файлом .json. Я думаю, что я почти у цели - я ценю вашу помощь!   -  person Hanny    schedule 22.12.2016


Ответы (2)


Вы должны были создать учетную запись службы и сохранить файл учетных данных json:

Тогда попробуйте это:

        ServiceAccountCredential credential;
        string[] Scopes = { SheetsService.Scope.Spreadsheets };
        string serviceAccountEmail = "[email protected]";
        string jsonfile = "xxxxxxxx-xxxxxxx.json";
        using (Stream stream = new FileStream(@jsonfile, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            credential = (ServiceAccountCredential)
                GoogleCredential.FromStream(stream).UnderlyingCredential;

            var initializer = new ServiceAccountCredential.Initializer(credential.Id)
            {
                User = serviceAccountEmail,
                Key = credential.Key,
                Scopes = Scopes
            };
            credential = new ServiceAccountCredential(initializer);
        }
person D Joyce    schedule 07.02.2018
comment
Спасибо! Это сработало для меня. Это не похоже на самый чистый (официальный) шаблон, но дает правильные результаты. Я ожидал, что API Google Sheets предоставит простой метод для создания ServiceAccountCredential из потока непосредственно за один вызов, как в случае с GoogleWebAuthorizationBroker. - person Xarbrough; 16.09.2018

Я сделал этот проект, чтобы позволить пользователям создавать учетные данные учетных записей служб, используя файлы учетных данных json или p12. И если вы хотите получить доступ к пользовательским данным из своего домена, не забудьте перед этим включить опцию широкого делегирования домена.

GoogleApiServiceFactory

person Daniel_dev    schedule 06.02.2018
comment
Ссылка на решение приветствуется, но убедитесь, что ваш ответ полезен и без нее: добавьте контекст вокруг ссылки, чтобы другие пользователи иметь некоторое представление о том, что это такое и почему он существует, а затем процитировать наиболее релевантную часть страницы, на которую вы ссылаетесь, на случай, если целевая страница недоступна. Ответы, которые представляют собой не более чем ссылку, могут быть удалены. - person Paul Roub; 06.02.2018