Google drive api 使用Google Drive时,如何授予使用SDK下载二进制文件的Java应用程序权限

Google drive api 使用Google Drive时,如何授予使用SDK下载二进制文件的Java应用程序权限,google-drive-api,Google Drive Api,我已经编写了一个Java应用程序,使用Google的SDK v3和Java 8从Google Drive下载二进制文件(不是Google文档或工作表或类似的东西——我上传到那里的二进制文件)。我的应用程序在列出文件方面没有问题,但当我尝试下载一个文件时,会出现权限错误: Exception in thread "main" com.google.api.client.http.HttpResponseException: 403 Forbidden { "error": { "errors

我已经编写了一个Java应用程序,使用Google的SDK v3和Java 8从Google Drive下载二进制文件(不是Google文档或工作表或类似的东西——我上传到那里的二进制文件)。我的应用程序在列出文件方面没有问题,但当我尝试下载一个文件时,会出现权限错误:

Exception in thread "main" com.google.api.client.http.HttpResponseException: 403 Forbidden
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "appNotAuthorizedToFile",
    "message": "The user has not granted the app 38578455738 read access to the file 1acfVsq9dUUYuk6q9gM69aWVasvdfr.",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 403,
  "message": "The user has not granted the app 38578455738 read access to the file 1acfVsq9dUUYuk6q9gM69aWVasvdfr."
 }
}
尝试下载的代码是:

    String fileId = "1acfVsq9dUUYuk6q9gM69aWVasvdfr";
    OutputStream outStream = new ByteArrayOutputStream();
    service.files().get(fileId).executeMediaAndDownloadTo(outStream);
我的问题是:

我如何知道我的应用程序是38578455738

我如何授予它(或任何人)下载权限

我曾尝试使用谷歌硬盘的网络界面与“任何人”共享,但没有帮助

  • 你知道你的应用程序是38578455738,因为你在谷歌API控制台注册了你的应用程序
  • 您使用OAuth 2.0授权您的应用程序,用户授予Google包括下载在内的访问范围,例如
  • 相关链接: 关于授权-

    设置API密钥-
    服务帐户不是你的。将服务帐户视为虚拟用户。它有谷歌硬盘账户、谷歌日历账户,可能还有更多

    服务帐户的好处是它们可以预授权,这使它们非常适合用于像cron作业这样的服务器到服务器通信

    Exception in thread "main" com.google.api.client.http.HttpResponseException: 403 Forbidden
    {
     "error": {
      "errors": [
       {
        "domain": "global",
        "reason": "appNotAuthorizedToFile",
        "message": "The user has not granted the app 38578455738 read access to the file 1acfVsq9dUUYuk6q9gM69aWVasvdfr.",
        "locationType": "header",
        "location": "Authorization"
       }
      ],
      "code": 403,
      "message": "The user has not granted the app 38578455738 read access to the file 1acfVsq9dUUYuk6q9gM69aWVasvdfr."
     }
    }
    
    就是这个意思。拥有文件1acfVsq9dUUYuk6q9gM69aWVasvdfr的用户尚未授予应用程序对其数据的访问权限38578455738

    在我看来,这条错误消息有点遗漏,这就是为什么我要求你发布你的身份验证代码。错误消息的读取方式使我认为当前经过身份验证的用户不是服务帐户,并且该用户没有经过同意过程


    但是,如果您当前以服务帐户登录。实际上是服务帐户用户没有访问权限(这假设您在登录下载文件时使用服务帐户身份验证代码)。然后,服务帐户才能访问该文件。拥有该文件的用户必须与服务帐户共享该文件。要做到这一点,请使用服务帐户电子邮件地址转到Google drive网站,找到有问题的罚款,并与服务帐户共享该文件。为它提供所需的读或写访问权限。然后服务帐户应该可以访问该文件。

    谢谢您的快速回复。我的应用程序是cron作业,因此没有用户可以单击任何内容。从阅读来看,我似乎需要一个API密钥而不是OAuth,但谷歌似乎更喜欢我使用“服务帐户”。这是正确的吗?服务帐户使用OAuth,但没有用户交互。请编辑您的问题,并包括您用于验证应用程序的方法。