Клиентская библиотека .NET Google DRIVE API - клиент не авторизован для получения токенов доступа с помощью этого метода - PullRequest
0 голосов
/ 30 октября 2018

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

  1. Создайте учетную запись службы и включите делегирование по всему домену (более 3 часов).
  2. Скачанный файл * .p12 и записанный секретный пароль
  3. Добавлена ​​область действия разрешения с идентификатором клиента учетной записи службы
  4. Использование приведенного ниже кода для создания сервиса и загрузки / получения данных с Google Drive

код

var certificate = new X509Certificate2(keyfilepath, "notasecret", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);

            string[] scopes = new string[] {
        DriveService.Scope.Drive,
        DriveService.Scope.DriveFile,
        DriveService.Scope.DriveAppdata,
        DriveService.Scope.DriveMetadata
        };

            var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceaccountemail)
            {
                Scopes = scopes,
                User = "abcr@mydomain.com"


            }.FromCertificate(certificate));
            // Create the service.
            var service = new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "Drive API Sample"

                //HttpClientFactory = new ProxySupportedHttpClientFactory()

            });



var keyname = "1231312.p12";
var newservicact = "asdfasdf@gsuite-migration-4564654.iam.gserviceaccount.com";

            _service = this.AuthorizeServiceAccountwithMimic(newservicact,keyname);


 Google.Apis.Drive.v3.Data.File body = new Google.Apis.Drive.v3.Data.File();
 body.Name = System.IO.Path.GetFileName(_uploadFile);
body.Description = _descrp;
 body.MimeType = GetMimeType(_uploadFile);
body.Properties = customcolumns;



byte[] byteArray = System.IO.File.ReadAllBytes(_uploadFile);
                System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);
                try
                {
                    FilesResource.CreateMediaUpload request = _service.Files.Create(body, stream, GetMimeType(_uploadFile));

                    request.SupportsTeamDrives = true;


                    request.ProgressChanged += Request_ProgressChanged;
                    request.ResponseReceived += Request_ResponseReceived;

                    request.Upload();

                    return request.ResponseBody;
                }

Я получаю ошибку ниже при первом отправлении данных в событии Request_ProgressChanged.

При выполнении методов Google API он выдает ошибку ниже

Ошибка: «unauthorized_client», Описание: «Клиент не авторизован для получить токены доступа, используя этот метод. ", Uri:" "

Я проверил многие форумы с поддержкой DWD и расширенных областей применения приложений .... кто-нибудь есть идеи, пожалуйста, помогите,

1 Ответ

0 голосов
/ 30 октября 2018

Есть несколько способов получить доступ к Google API. используя Oauth2 и используя учетные записи служб.

Клиент создан и код, используемый для учетной записи службы, отличается от клиента, созданного для приложения браузера, и кода, который используется для аутентификации в нем. Если вы зайдете в консоль разработчика Google и создадите клиент браузера, вы не сможете использовать код учетной записи службы с этим клиентом. То же самое касается кода учетной записи службы с идентификатором клинета браузера.

Ошибка: «unauthorized_client», Описание: «Клиент не авторизован для получения токенов доступа с помощью этого метода.», Uri: ««

В основном означает, что используемый вами клиент имеет неверный тип для кода, который вы используете.

Вернитесь в консоль разработчика Google. Создайте учетную запись службы. Загрузите учетную запись службы .json file

ServiceAccount.cs

using Google.Apis.Drive.v3;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;

namespace GoogleSamplecSharpSample.Drivev3.Auth
{

    public static class ServiceAccountExample
    {

        /// <summary>
        /// Authenticating to Google using a Service account
        /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount
        /// </summary>
        /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com</param>
        /// <param name="serviceAccountCredentialFilePath">Location of the .p12 or Json Service account key file downloaded from Google Developer console https://console.developers.google.com</param>
        /// <returns>AnalyticsService used to make requests against the Analytics API</returns>
        public static DriveService AuthenticateServiceAccount(string serviceAccountEmail, string serviceAccountCredentialFilePath, string[] scopes)
        {
            try
            {
                if (string.IsNullOrEmpty(serviceAccountCredentialFilePath))
                    throw new Exception("Path to the service account credentials file is required.");
                if (!File.Exists(serviceAccountCredentialFilePath))
                    throw new Exception("The service account credentials file does not exist at: " + serviceAccountCredentialFilePath);
                if (string.IsNullOrEmpty(serviceAccountEmail))
                    throw new Exception("ServiceAccountEmail is required.");                

                // For Json file
                if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".json")
                {
                    GoogleCredential credential;
                    using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read))
                    {
                        credential = GoogleCredential.FromStream(stream)
                             .CreateScoped(scopes);
                    }

                    // Create the  Analytics service.
                    return new DriveService(new BaseClientService.Initializer()
                    {
                        HttpClientInitializer = credential,
                        ApplicationName = "Drive Service account Authentication Sample",
                    });
                }
                else if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".p12")
                {   // If its a P12 file

                    var certificate = new X509Certificate2(serviceAccountCredentialFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
                    var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
                    {
                        Scopes = scopes
                    }.FromCertificate(certificate));

                    // Create the  Drive service.
                    return new DriveService(new BaseClientService.Initializer()
                    {
                        HttpClientInitializer = credential,
                        ApplicationName = "Drive Authentication Sample",
                    });
                }
                else
                {
                    throw new Exception("Unsupported Service accounts credentials.");
                }

            }
            catch (Exception ex)
            {                
                throw new Exception("CreateServiceAccountDriveFailed", ex);
            }
        }
    }
}

Если это все еще не работает, то это означает, что вы неправильно настроили делегирование домена в учетную запись службы делегирование полномочий

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