0

abc@gmail.com という Gmail アカウントを持っています。Google ドライブ検索 API を使用するためのクライアント シークレットを生成しました。このサンプル コードでは、コンソール アプリケーションを使用してファイルを検索および取得できました。しかし、このコードはトークンをドライブにローカルに保存するため、資格情報をプログラムで渡すためにService Account、この投稿で説明したように を作成しました。

作成したサービス アカウントには次の役割があります。

  1. サービス アカウント管理者
  2. サービス アカウント キー管理者
  3. サービス アカウント トークン作成者
  4. サービス アカウント ユーザー
  5. オーナー

しかし、サービス アカウントを使用してファイルを取得しようとすると、abc@gmail.com アカウント ドライブにファイルがあるにもかかわらず、ファイルが返されません。

これが私のコードです-

static void Main(string[] args)
{
    try
    {
        //var service = AuthenticateServiceAccountV2();
        var service = AuthenticateServiceAccountV1(GServiceAccount, "keycredentials.json");

        string pageToken = null;
        do
        {
            var request = service.Files.List();
            request.Q = $"name contains 'l'";
            request.Spaces = "drive";
            request.Fields = "nextPageToken, files(id, name, modifiedTime, fileExtension, webViewLink)";
            request.PageToken = pageToken;
            request.PageSize = 5;
            var result = request.Execute();
            foreach (Google.Apis.Drive.v3.Data.File file in result.Files)
            {

                var t = service.Files.Get(file.Id);
                Console.WriteLine(String.Format("Found file: {0} ({1}) Link for download: {2}", file.Name, file.Id, GenerateUrl(file.Id)));
            }
            pageToken = result.NextPageToken;
        } while (pageToken != null);
        Console.Read();
    }
    catch(Exception ex)
    {
        throw ex;
    }
}
static DriveService AuthenticateServiceAccountV1(string ServiceAccountEmail, string KeyFilePath)
{
    try
    {
        if (string.IsNullOrEmpty(KeyFilePath))
            throw new Exception("Path to the service account credentials file is required.");
        if (!File.Exists(KeyFilePath))
            throw new Exception("The service account credentials file does not exist at: " + KeyFilePath);
        if (string.IsNullOrEmpty(ServiceAccountEmail))
            throw new Exception("ServiceAccountEmail is required.");
        if (Path.GetExtension(KeyFilePath).ToLower() == ".json")
        {
            GoogleCredential credential;
            using (var stream = new FileStream(KeyFilePath, FileMode.Open, FileAccess.Read))
            {
                credential = GoogleCredential.FromStream(stream)
                     .CreateScoped(Scopes);
            }
            return new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "Drive Service account Authentication Sample",
            });
        }
        else if (Path.GetExtension(KeyFilePath).ToLower() == ".p12")
        {
            var certificate = new X509Certificate2(KeyFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
            ServiceAccountCredential credential = new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(ServiceAccountEmail)
                {
                    Scopes = Scopes,
                }.FromCertificate(certificate));

            return new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName
            });
        }
        else
        {
            throw new Exception("Unsupported Service accounts credentials.");
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}
4

0 に答える 0