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

在C#中修改Google驱动器文件导致403,c#,google-api,google-drive-api,google-oauth,google-api-dotnet-client,C#,Google Api,Google Drive Api,Google Oauth,Google Api Dotnet Client,我已经建立了一个C#应用程序,目前已成功联系Google Drive,列出文件,下载文件并读取其内容。到目前为止还不错,但现在我需要能够修改文件,我发现出于某种原因,这根本没有发生。我相信我在进行身份验证时使用了正确的范围,并且已经测试了许多组合,但都没有结果。当遇到“updateRequest.Execute()”时,我将继续收到以下错误: 下面提供了我用于身份验证的代码: string[] scopes = { DriveService.Scope.Drive }; UserCredent

我已经建立了一个C#应用程序,目前已成功联系Google Drive,列出文件,下载文件并读取其内容。到目前为止还不错,但现在我需要能够修改文件,我发现出于某种原因,这根本没有发生。我相信我在进行身份验证时使用了正确的范围,并且已经测试了许多组合,但都没有结果。当遇到“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();
}
需要注意的重要事项:

  • 当我在google api中设置访问权限时,我的经过身份验证的应用程序被注册为“其他”
  • 我使用的DriveService.Scope是“DriveService.Scope.Drive”
  • 我已成功下载文件
  • 我没有通过此应用程序添加要修改的文件
我不确定是否需要将其设置为服务帐户,但就我所了解的范围而言,我应该能够修改文件。我的要求是能够下载和修改驱动器中的所有文件和文件夹,无论其来源如何

提前谢谢你

权限不足

确切地说,您当前登录的用户没有授予您的应用程序执行您尝试执行的操作的权限

要使用该方法,您必须已请求访问以下作用域之一

您似乎正在请求
DriveService.Scope.Drive
,这意味着您可能在用户通过身份验证后更改了作用域。因此,您的应用程序正在使用您首次请求同意时授予的凭据

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

string credPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart.json");
您可以删除
“用户”
的凭据文件,该文件是您为用户硬编码的名称。或者,您可以先运行以下命令,这将导致用户撤销对应用程序的访问,然后下次运行时,它将再次请求访问

credential.RevokeTokenAsync(CancellationToken.None);
还有第三个选项,您应该能够在请求时调用强制提示,但就我而言,我记不起该命令了。我会四处看看,看看我是否能找到它,如果我找到了,我会编辑这个

服务账户

我不确定是否需要将此设置为服务帐户


除非您的应用程序设计为仅访问单个驱动器帐户,并且您不会请求访问用户驱动器帐户,否则您不应该使用服务帐户!我不知道客户端凭据的工作方式,所以这很有意义。删除该文件确实允许它在重新验证后按预期工作,因此非常感谢。顺便说一句,你的网站对于学习GoogleAPI非常有帮助,已经帮助我解决了web应用程序认证问题。