Google Drive API v3 использует JSON вместо P12 (служебная учетная запись) — непредвиденный символ

Ошибка: обнаружен непредвиденный символ при синтаксическом анализе значения: e. Путь '', строка 0, позиция 0.

Я использую клиентскую библиотеку Google .Net для доступа к API диска Google v3, в частности к Пакет Google.Apis.Drive.v3. Я разрешаю использовать «Учетную запись службы» с C#.

Авторизация по ключу p12 не проблема. Однако рекомендуется использовать JSON, а формат p12 поддерживается для обратной совместимости.

Я скачал JSON-файл из Google Developers Console и попытался авторизоваться с помощью следующего кода:

    public static Google.Apis.Drive.v3.DriveService AuthenticateServiceAccountJSON(string keyFilePath) {

        // check the file exists
        if (!File.Exists(keyFilePath)) {
            Console.WriteLine("An Error occurred - Key file does not exist");
            return null;
        }

        string[] scopes = new string[] { DriveService.Scope.Drive,                  // view and manage your files and documents
                                         DriveService.Scope.DriveAppdata,           // view and manage its own configuration data
                                         DriveService.Scope.DriveFile,              // view and manage files created by this app
                                         DriveService.Scope.DriveMetadataReadonly,  // view metadata for files
                                         DriveService.Scope.DriveReadonly,          // view files and documents on your drive
                                         DriveService.Scope.DriveScripts };         // modify your app scripts     

        try {
            using (var stream = new FileStream(keyFilePath, FileMode.Open, FileAccess.Read)) {
                var credential = GoogleCredential.FromStream(stream);
                if (credential.IsCreateScopedRequired) {
                    credential.CreateScoped(scopes);
                }
                // Create the service.
                Google.Apis.Drive.v3.DriveService service = new Google.Apis.Drive.v3.DriveService(new BaseClientService.Initializer() {
                    HttpClientInitializer = credential,
                    ApplicationName = "MyDrive",
                });
                return service;
            }
        } catch (Exception ex) {
            Console.WriteLine(ex.InnerException);
            return null;

        }
    }

Я просмотрел файл JSON в блокноте, и он кажется зашифрованным.

"ewogICJ0eXBlIjogInNlcnZpY2VfYWNjb3VudCIsCiAgInByb2plY3RfaWQiOiAicmFkaWFudC1tZXJjdXJ5LTEyMjkwNyIsCiAgIn.........."

Можно ли продолжать использовать P12?


person Marcel    schedule 02.03.2016    source источник
comment
они оба должны работать, лично я использую файл p12. Это должно помочь github.com/google/google-api-dotnet-client /вопросы/659   -  person DaImTo    schedule 02.03.2016
comment
Спасибо, я собираюсь использовать p12. Если есть кто-нибудь, кто может что-то сказать о файле JSON или о том, как он должен работать, дайте мне знать.   -  person Marcel    schedule 02.03.2016


Ответы (2)


Это работает для меня, используя файл учетных данных JSON из консоли разработчиков Google. Я использую службу Analytics, но просто поменяю местами соответствующие имена для службы Drive:

private AnalyticsReportingService service;

public async Task GetAuthorizationByServiceAccount()
    {
        string[] scopes = new string[] { AnalyticsReportingService.Scope.AnalyticsReadonly }; // Put your scopes here
        var keyFilePath = AppContext.BaseDirectory + @"KeyFile.json";

        //Console.WriteLine("Key File: " + keyFilePath);

        var stream = new FileStream(keyFilePath, FileMode.Open, FileAccess.Read);

        var credential = GoogleCredential.FromStream(stream);
        credential = credential.CreateScoped(scopes);

        service = new AnalyticsReportingService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "<Your App Name here>",
        });
    }
person Sayron5    schedule 14.04.2016
comment
Это было полезно, спасибо. В итоге я поместил файл json в ресурс, но вышеизложенное заставило меня двигаться вперед. - person sobelito; 17.07.2016
comment
Знаете ли вы, как я могу извлечь токен, чтобы я мог создать авторизацию на стороне сервера и построить диаграммы Google? ga-dev-tools.appspot.com/embed-api /серверная-авторизация - person Patrick; 27.01.2017

Убедитесь, что вы загружаете правильный файл...

GoogleCredential.FromStream(stream)

работает с файлом JSON. Это должно выглядеть примерно так:

{
  "type": "service_account",
  "project_id": "",
  "private_key_id": "",
  "private_key": "-----BEGIN PRIVATE KEY-----
---END PRIVATE KEY-----\n",
  "client_email": "",
  "client_id": "",
  "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://console.developers.google.com/apis/credentials, нажав кнопку «Загрузить JSON» в правой части сетки, показывающей идентификаторы клиентов. Просто убедитесь, что тип для выбранного идентификатора — «Клиент сервисной учетной записи».

person Igor    schedule 04.04.2016