在 C# 中修改 Google 驱动文件导致 403

Modifying Google Drive file in C# resulting in 403

我已经设置了一个 C# 应用程序,目前可以成功联系 Google 驱动器、列出文件、下载文件并读取它们的内容。到目前为止还不错,但现在我需要能够修改文件,而且我发现出于某种原因,这并没有发生。我相信我在进行身份验证时使用的范围是正确的,并且测试了许多组合都无济于事。当它点击 'updateRequest.Execute()':

时,我继续收到以下错误

下面提供了我用于验证的代码:

string[] scopes = { DriveService.Scope.Drive };
UserCredential credentials;

using (var stream = new FileStream(RESOURCE_DIRECTORY + "\google_credentials_v2.json", FileMode.Open, FileAccess.Read))
{
    string credPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart.json");

    credentials = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets, 
        scopes,
        "user", 
        CancellationToken.None, 
        new FileDataStore(credPath, true)).Result;
}

return credentials;

我用来修改文件的代码如下:

public static void MoveFileToNewFolder(DriveService service, string folderName, string fileId, string previousParents = "")
{
    FilesResource.UpdateRequest updateRequest = service.Files.Update(new Google.Apis.Drive.v3.Data.File(), fileId);
    updateRequest.Fields = "id, parents";
    updateRequest.AddParents = GetFolderIDFromName(service, folderName);
    updateRequest.RemoveParents = previousParents;
    updateRequest.Execute();
}

重要注意事项:

我不确定是否需要将其设置为服务帐户,但据我了解范围,我应该能够修改文件。我的要求是能够下载和修改驱动器中的所有文件和文件夹,无论其来源如何。

提前致谢!

Insufficient permissions

确切地说,您当前登录的用户尚未授予您的应用程序执行您正在尝试执行的操作的权限。

为了使用 Files.update 方法,您必须请求访问以下范围之一

您似乎在请求 DriveService.Scope.Drive,这意味着您可能在用户通过身份验证后更改了范围。因此,您的应用程序 运行 正在关闭您第一次请求同意时授予的凭据。

此用户的凭据存储在此文件夹中

string credPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart.json");

您可以删除 "user" 的凭据文件,这是您为用户硬编码的名称。或者您可以先 运行 以下命令,这将导致用户撤销对您的应用程序的访问权限,然后下次您 运行 它应该再次请求访问权限

credential.RevokeTokenAsync(CancellationToken.None);

还有第三个选项,您应该可以根据请求调用强制提示,但我记不住那个命令。我会四处看看是否能找到它,如果找到就编辑它。

服务帐号

I am unsure of whether I needed to set this up as a service account instead

除非您的应用程序设计为仅访问单个驱动器帐户,并且您不会请求访问用户驱动器帐户,否则您不应使用服务帐户