0

Мы протестировали демонстрационный код Google Диска (для консольного приложения), и это стало правильным, после чего мы пытаемся внедрить его в веб-приложение который в настоящее время размещается на локальном хосте. Приложение дает нам это исключение:Доступ к Google Диск: необходимо установить хотя бы один клиентский секрет (установленный или веб-сайт)

Исключение типа «System.InvalidOperationException» произошло в Google.Apis.Auth.dll, но не был обработан в коде пользователя Дополнительная информация : По крайней мере один клиент секреты (Установленная или Web) должен быть установлен

код, который мы пытаемся запустить это:

UserCredential credential; 
     GoogleClientSecrets s= new GoogleClientSecrets(); 
     s.Secrets.ClientId="xxxxxxxxxx-xxxxxxxx.apps.googleusercontent.com"; 
     s.Secrets.ClientSecret="yyyyyyyyyyyyyyyyyyyyy"; 
     credential = GoogleWebAuthorizationBroker.AuthorizeAsync(s.Secrets,Scopes,"user",CancellationToken.None,null).Result; 
     var service = new DriveService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential 
      //ApplicationName = ApplicationName, 
     }); 

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

Мы пытаемся получить доступ к нему без присмотра, мы использовали игровую площадку google, чтобы получить первый токен обновления.

Пожалуйста, помогите нам, мы стараемся сделать это за последние 7 дней без успеха.

+0

это может вам начать работу. http://www.daimto.com/google-drive-authentication-c/ В клиентской библиотеке будет храниться обновление для вас, вам не нужно справляться с этим. В производстве вы действительно не должны использовать игровые площадки для создания ваших токенов обновления, которые вы должны делать с помощью своего кода. – DaImTo

+0

Я хотел бы, чтобы пользователи подключались и могли получать доступ к моему приводу Google и манипулировать им. Мне нужна учетная запись службы? Я также узнал, что для учетной записи службы нужны Google Apps для бизнеса или что-то в этом роде, правильно ли это? –

+0

Да, вы должны использовать учетную запись службы, а не Oauth2.Я ничего не знаю о приложениях для бизнеса, поэтому не могу рассказать об этом. – DaImTo

ответ

2

Код для учетной записи службы:

string[] scopes = new string[] {DriveService.Scope.Drive}; // Full access 
var keyFilePath = @"c:\file.p12" ; // Downloaded from https://console.developers.google.com 
var serviceAccountEmail = "[email protected]"; // found https://console.developers.google.com 


//loading the Key file 
var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable); 
var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail) { 
Scopes = scopes}.FromCertificate(certificate)); 

код вырванные из Google Drive Authentication C# который также incudes пример использования oauth2

Загрузить файл

/// <summary> 
     /// Uploads a file 
     /// Documentation: https://developers.google.com/drive/v2/reference/files/insert 
     /// </summary> 
     /// <param name="_service">a Valid authenticated DriveService</param> 
     /// <param name="_uploadFile">path to the file to upload</param> 
     /// <param name="_parent">Collection of parent folders which contain this file. 
     ///      Setting this field will put the file in all of the provided folders. root folder.</param> 
     /// <returns>If upload succeeded returns the File resource of the uploaded file 
     ///   If the upload fails returns null</returns> 
     public static File uploadFile(DriveService _service, string _uploadFile, string _parent) { 

      if (System.IO.File.Exists(_uploadFile)) 
      { 
       File body = new File(); 
       body.Title = System.IO.Path.GetFileName(_uploadFile); 
       body.Description = "File uploaded by Diamto Drive Sample"; 
       body.MimeType = GetMimeType(_uploadFile); 
       body.Parents = new List<ParentReference>() { new ParentReference() { Id = _parent } }; 

       // File's content. 
       byte[] byteArray = System.IO.File.ReadAllBytes(_uploadFile); 
       System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray); 
       try 
       { 
        FilesResource.InsertMediaUpload request = _service.Files.Insert(body, stream, GetMimeType(_uploadFile)); 
        //request.Convert = true; // uncomment this line if you want files to be converted to Drive format 
        request.Upload(); 
        return request.ResponseBody; 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("An error occurred: " + e.Message); 
        return null; 
       } 
      } 
      else { 
       Console.WriteLine("File does not exist: " + _uploadFile); 
       return null; 
      }   

     } 

код вырванные из DaimtoGoogleDriveHelper.cs

Совет:

Помнить с учетной записью службы является то, что это не вы, это фиктивная учетная запись пользователя. У учетной записи службы есть своя учетная запись для Google, поэтому загрузка файлов на нее будет загружена на ее учетную запись, а не на вашу учетную запись. Что вы можете сделать, так это взять адрес электронной почты учетной записи службы, чтобы добавить его в качестве пользователя в папку в вашей личной учетной записи Google, предоставляя ей доступ на запись. Затем это позволит учетной записи службы загружать файл в вашу личную учетную запись Google. Не забудьте исправить файл после загрузки, предоставив себе разрешения для файла другим, так как владельцем файла будет учетная запись службы. В настоящее время в Google Диске появляется ошибка, связанная с необходимостью исправления разрешений на файл после загрузки файла, который вы не можете сделать, в то время, когда вы загрузите его двухэтапным процессом. (Было там сделано, что)

Google Проект привода образец можно найти на GitHub

+0

«Не забудьте исправить файл после загрузки, предоставив себе разрешения для файла, иначе мудрый владелец файла будет учетной записью службы». Как мы можем это сделать в C# –

 Смежные вопросы

  • Нет связанных вопросов^_^