0

Я собрал приведенный ниже примерный код, используя вспомогательный код, который поставляется с примерами Google для его точечных чистых клиентских библиотек google api.Попытка выполнить простой тест API для Google Drive с использованием библиотеки dot dot net net и учетной записи службы

Проблема: он не перечисляет информацию о файлах, даже если я загрузил ее в учетную запись Gooogle, которой принадлежит эта учетная запись службы.

Когда я попытался использовать авторизацию oauth, чтобы сделать то же самое, я получил ожидаемый результат (я сделал это на этой странице: https://developers.google.com/drive/v2/reference/files/list).

Возможно, проблема с областью обзора или чем-то еще; есть идеи?

Мои попытки регистрации всех запросов и ответов HTTP полностью не удались. Похоже, что у клиентских библиотек Google есть регистрация на основе api-api, и я не вижу никаких данных для Google Drive. Кроме того, использование log4net с dotnetopenauth ничего не делало, когда я его пробовал (в клиентских библиотеках google используется функция net net open auth).

Вот код:

using System; 
using System.Security.Cryptography.X509Certificates; 
using Google.Apis.Authentication.OAuth2; 
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth; 
using Google.Apis.Drive.v2; 
using Google.Apis.Util; 
using Google.Apis.Services; 

namespace Drive.ServiceAccount 
{ 
    class Program 
    { 

     static Program() 
     { 
// 
      //ApplicationContext.RegisterLogger(new Log4NetLogger()); 
      log4net.Config.XmlConfigurator.Configure();   
     } 

     private const string SERVICE_ACCOUNT_EMAIL = "<blablalba>@developer.gserviceaccount.com"; 
     private const string SERVICE_ACCOUNT_PKCS12_FILE_PATH = @"<blablalba>-privatekey.p12"; 

     /// <summary> 
     /// Build a Drive service object authorized with the service account. 
     /// </summary> 
     /// <returns>Drive service object.</returns> 
     static DriveService BuildService() 
     { 
      X509Certificate2 certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", 
       X509KeyStorageFlags.Exportable); 

      var _client = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate) 
      { 
       ServiceAccountId = SERVICE_ACCOUNT_EMAIL, 
       Scope = DriveService.Scopes.Drive.GetStringValue(), 
      }; 
      var auth = new OAuth2Authenticator<AssertionFlowClient>(_client, AssertionFlowClient.GetState); 

      var service = new DriveService(new BaseClientService.Initializer() 
      { 
       Authenticator = auth, 
       ApplicationName = "Drive API Sample", 
      }); 

      return service; 
     } 

     static void Main(string[] args) 
     { 
      var _driveService = BuildService(); 

      var _files = _driveService.Files.List().Execute(); 

      foreach (var _file in _files.Items) 
      { 
       Console.WriteLine(_file.Id); 
      } 

      Console.WriteLine("Done"); 

      Console.ReadLine(); 
     } 

    } 
} 

Благодаря Robadob для исправления моего недопонимания о служебных учетных записей. Вот некоторые рабочий код (только основной метод все остальное, как указано выше):

static void Main(string[] args) 
{ 

    String _newFileName = Guid.NewGuid().ToString() + ".xml"; 

    new XDocument(new XElement("root", new XElement("someNode", "someValue"))) 
     .Save(_newFileName); 

    Console.WriteLine("New file saved locally with name {0}.", _newFileName); 

    var _driveService = BuildService(); 

    // upload the file: 

    //var uploadStream = 
    // new System.IO.FileStream(_newFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); 

    byte[] byteArray = System.IO.File.ReadAllBytes(_newFileName); 
    MemoryStream _byteStream = new MemoryStream(byteArray); 

    var insert = _driveService.Files.Insert(new Google.Apis.Drive.v2.Data.File 
    { 
     Title = _newFileName, 
    }, _byteStream, "text/xml"); 

    Task _uploadTask = insert.UploadAsync(); 

    _uploadTask.ContinueWith(t => Console.WriteLine("Upload Task Completed"),TaskContinuationOptions.OnlyOnRanToCompletion); 
    // 

    try 
    { 
     _uploadTask.Wait(); 
    } 
    catch (AggregateException _ex) 
    { 
     foreach (Exception ex in _ex.Flatten().InnerExceptions) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

    Console.WriteLine("Reading files"); 

    var _files = _driveService.Files.List(); 


    foreach (var _file in _files.Execute().Items) 
    { 
     Console.WriteLine(_file.Id); 
    } 

    Console.WriteLine("Done"); 

    Console.ReadLine(); 
} 

ответ

0

Как это учетная запись службы я не считаю, что это имеет свой собственный «Google Drive», учетные записи служб существуют действовать от имени пользователя.

Чтобы «олицетворять» пользователя, файлы которого вы хотите перечислить, вам необходимо передать параметр prn при создании токена доступа;

Детали можно найти здесь, если вы прокрутите страницу вниз до «Дополнительные претензии»; https://developers.google.com/accounts/docs/OAuth2ServiceAccount#formingclaimset

Кажется, что вы можете установить пользователя через это;

 var _client = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate) 
     { 
      ServiceAccountId = SERVICE_ACCOUNT_EMAIL, 
      Scope = DriveService.Scopes.Drive.GetStringValue(), 
      ServiceAccountUser = "[email protected]" 
     }; 

Если вы хотите, чтобы войти в HTTP-взаимодействия, я нашел Fiddler быть намного проще в установке, чем другие методы.

+0

Черт, я слышал о олицетворении, но я подумал, что другая идея учетной записи службы заключается в том, что приложение может иметь свои собственные ресурсы и получать к ним доступ. – Elliot

+0

Возможно, это может быть (я не использовал API приводов Google), однако в вашем вопросе вы говорите, что добавили файл пользователю, которому принадлежит учетная запись службы (а не учетная запись службы). Я не ожидал, что вы сможете получить доступ к файлам учетных записей служб не через API, поэтому попробуйте добавить файл через учетную запись службы через API. – Robadob

+0

OK спасибо; теперь может быть ясно. Учетная запись службы отделена от учетной записи google, в консоли которой я создал учетную запись службы. Спасибо вам за помощь. – Elliot