Google Drive API 尤其是导出功能最近是否发生了任何变化,这会导致它在 2018 年 3 月 27 日之后使用 API 密钥访问时失败?
它是可能的,但很可能是你不会得到任何官方消息的隐形改变。不久前,我看到有人发布了一个类似的问题,他们正在使用 API 密钥更新 Google 表格,但它突然停止工作。
IMO 如果谷歌改变了这可能是一件好事。API 密钥用于访问公共数据。如果有人确实设法找到您的文档的文件 ID,然后他们就可以更新您的文档,那么将文档设置为公开是一个非常糟糕的主意。
建议:
您应该使用的是服务帐户。服务帐户是虚拟用户,通过在 Google 开发人员控制台上创建服务帐户凭据,然后获取服务帐户电子邮件地址,您可以与服务帐户共享 Google Drive 上的文件,授予其访问所述文件的权限,而无需公开文件。
您尚未指定您使用的语言,但您说您正在制作 Windows 服务,所以我假设您使用的是 .net。这是使用 Google .net 客户端库进行服务帐户身份验证的示例。
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);
}
}
}
从serviceaccount.cs中提取的代码。假设您已经在使用 Google .net 客户端库,则此方法返回的服务将与您使用 api 密钥使用的驱动器服务相同。
一旦您授予您的服务帐户对文件的访问权限,它就可以在需要时访问该文件,因为您已通过与它共享文件来对其进行预授权,因此无需进行身份验证。