【问题标题】:Modifying Google Drive file in C# resulting in 403在 C# 中修改 Google Drive 文件导致 403
【发布时间】:2019-04-05 08:47:09
【问题描述】:

我已经设置了一个 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”
  • 我已经成功下载文件了
  • 我没有通过此应用程序添加要修改的文件

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

提前谢谢你!

【问题讨论】:

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


    【解决方案1】:

    权限不足

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

    要使用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);
    

    还有第三个选项,您应该能够根据请求调用强制提示,但对于我的一生,我不记得那个命令。我会环顾四周看看能不能找到它,如果找到了就编辑它。

    服务帐号

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

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

    【讨论】:

    • 太棒了!我不知道客户端凭据的工作方式,所以这很有意义。删除文件确实允许它在重新验证后按预期工作,所以非常感谢你。顺便说一句,您的网站对学习 Google API 非常有帮助,已经帮助我解决了网络应用程序身份验证问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2020-03-10
    • 2022-09-26
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多