我有一个 gmail 帐户说 abc@gmail.com,我已经生成了一个使用 google drive search api 的客户端密码。通过这个示例代码,我能够使用我的控制台应用程序搜索和获取文件。但是这段代码将令牌保存到本地驱动器上,因此为了以编程方式传递凭据,我创建了一个Service Account
如本文所述的。
我创建的服务帐户具有以下角色-
- 服务帐号管理员
- 服务帐号密钥管理员
- 服务帐户令牌创建者
- 服务帐号用户
- 所有者
但是,当我尝试使用服务帐户获取文件时,即使我的 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;
}
}