在C#中修改Google云端硬盘文件,结果为403

时间:2019-04-05 08:47:09

标签: c# google-api google-drive-api google-oauth google-api-dotnet-client

我已经建立了一个C#应用程序,该应用程序当前可以成功联系Google云端硬盘,列出文件,下载文件并读取其内容。到目前为止很好,但是现在我需要能够修改文件,并且由于某种原因,我发现这只是没有发生。我相信我在进行身份验证时已经使用了正确的范围,并且测试了许多组合都无济于事。当我点击“ updateRequest.Execute()”时,我继续收到以下错误:

Exception message

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

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'
  • 我已经成功能够下载文件
  • 我没有添加要通过此应用程序修改的文件

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

提前谢谢!

1 个答案:

答案 0 :(得分:1)

  

权限不足

完全意味着您当前登录的用户尚未授予您的应用程序执行您尝试做的权限。

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

enter image description here

您似乎正在请求MEMBER_NUMBER SALYEAR SALMONTH RECEIVED_DATE ------------- ----------- ----------- ------------- 2 2019 1 2019-10-20 1 2019 1 2019-10-10 ,这意味着自从用户经过身份验证以来,您可能已经更改了范围。因此,您的应用程序将使用您首次请求同意时授予的凭据。

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

DriveService.Scope.Drive

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

"user"

还有第三个选项,您应该能够在请求上调用强制提示,但是对于我来说,我不记得该命令。我会环顾四周,看看是否可以找到它,如果找到它,请对其进行编辑。

服务帐户

  

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

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