【问题标题】:com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbiddencom.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
【发布时间】:2015-12-05 06:10:12
【问题描述】:

我正在尝试将文本文件上传到我的 Google 云端硬盘帐户。不管怎样,我总是遇到com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden

堆栈跟踪:

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Forbidden",
    "reason" : "forbidden"
  } ],
  "message" : "Forbidden"
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:423)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
    at chatterjee.sandeep.javabase.miscellaneous.DriveCommandLine.main(DriveCommandLine.java:69)

这是DriveCommandLine.java的第69行

File file = service.files().insert(body, mediaContent).execute();

完整代码:

import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class DriveCommandLine {

    private static String CLIENT_ID = "CLIENT_ID";
    private static String CLIENT_SECRET = "CLIENT_SECRET";

    private static String REDIRECT_URI = "REDIRECT_URI";

    public static void main(String[] args) throws IOException {
        HttpTransport httpTransport = new NetHttpTransport();
        JsonFactory jsonFactory = new JacksonFactory();

        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET,
        Arrays.asList(DriveScopes.DRIVE_FILE)).setAccessType("online")
        .setApprovalPrompt("auto").build();

        String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI)
        .build();
        System.out
        .println("Please open the following URL in your browser then type the authorization code:");
        System.out.println("  " + url);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String code = br.readLine();

        GoogleTokenResponse response = flow.newTokenRequest(code)
        .setRedirectUri(REDIRECT_URI).execute();
        GoogleCredential credential = new GoogleCredential()
        .setFromTokenResponse(response);

        // Create a new authorized API client
        Drive service = new Drive.Builder(httpTransport, jsonFactory,
        credential).build();

        // Insert a file
        File body = new File();
        body.setTitle("My document");
        body.setDescription("A test document");
        body.setMimeType("text/plain");

        java.io.File fileContent = new java.io.File(
        "/path/to/TextFile.txt");
        FileContent mediaContent = new FileContent("text/plain", fileContent);

        File file = service.files().insert(body, mediaContent).execute();
        System.out.println("File ID: " + file.getId());
    }
}

我的项目构建路径中有以下 jar:

commons-logging-1.1.1.jar
google-api-client-1.18.0-rc.jar
google-api-client-android-1.18.0-rc.jar
google-api-client-appengine-1.18.0-rc.jar
google-api-client-gson-1.18.0-rc.jar
google-api-client-jackson2-1.18.0-rc.jar
google-api-client-java6-1.18.0-rc.jar
google-api-client-servlet-1.18.0-rc.jar
google-api-services-drive-v1-rev123-1.18.0-rc.jar
google-http-client-1.18.0-rc.jar
google-http-client-android-1.18.0-rc.jar
google-http-client-appengine-1.18.0-rc.jar
google-http-client-gson-1.18.0-rc.jar
google-http-client-jackson2-1.18.0-rc.jar
google-http-client-jdo-1.18.0-rc.jar
google-oauth-client-1.18.0-rc.jar
google-oauth-client-appengine-1.18.0-rc.jar
google-oauth-client-java6-1.18.0-rc.jar
google-oauth-client-jetty-1.18.0-rc.jar
google-oauth-client-servlet-1.18.0-rc.jar
gson-2.1.jar
httpclient-4.0.3.jar
httpcore-4.0.1_1.jar
jackson-core-2.1.3.jar
jdo2-api-2.3-eb.jar
jetty-util-6.1.26.jar
jsr305-1.3.9.jar
transaction-api-1.1-rev-1.jar

目前我有两个启用 Drive API 的项目。

现在我应该在哪里正确设置权限来解决这个问题?

另外,我在这里做错了什么?

【问题讨论】:

标签: java google-drive-api


【解决方案1】:

几个月来一直有相同的配额错误。什么都试过了。它看起来像谷歌方面的问题。 在所有 google 产品中,Calendar API 没有任何方式来支持他们的团队。如果有人知道或能够就日历 API 联系 Google 团队,请告诉我们!

【讨论】:

    【解决方案2】:

    我刚刚遇到了这个问题,很可能您使用不允许插入文件的范围创建了凭据文件。删除凭证文件并重新运行。

    【讨论】:

      【解决方案3】:

      对我来说,问题是 url 是 http...,它应该是 https...

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,我做了以下更改并解决了问题

        1) 将 SheetsScopes.DRIVE 添加到要在 authorize() 中给出的范围

        private static final List<String> SCOPES =
                    Arrays.asList(SheetsScopes.SPREADSHEETS,SheetsScopes.DRIVE);
        

        2) 创建了一个新目录,这样下次我运行它时,它会进行身份验证并将凭据保存到新创建的目录中

        private static final java.io.File DATA_STORE_DIR = new java.io.File(
                System.getProperty("user.home"), ".credentials/2/sheets.googleapis.com-java-quickstart.json");
        

        【讨论】:

        • ^这个。 DATA_STORE_DIR 是 FileDataStoreFactory 的参数。如果您已经在使用其他 google API,例如工作表,则需要覆盖 data_store 中的凭证文件
        【解决方案5】:

        我有同样的问题,但在我的情况下解决这个问题:

        private static final List<String> SCOPES =
                Arrays.asList(DriveScopes.DRIVE);
        

        来自DriveScopes

        同时创建一个新目录

        private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".credentials/2/drive-java-quickstart.json");
        

        我解决了问题

        【讨论】:

          【解决方案6】:

          找了半天,发现这个答案隐藏在搜索引擎中:

          将定义范围的行更改为:

          private static final List<String> SCOPES = Arrays.asList(GmailScopes.MAIL_GOOGLE_COM);
          

          https://stackoverflow.com/a/38599382/1317559

          【讨论】:

            【解决方案7】:

            当您更改 SCOPE 并继续使用旧令牌时,会发生此问题。只需删除 StoredCredential 文件即可。Idea

            【讨论】:

              【解决方案8】:

              对我来说,问题是 SCOPES,它设置为 SheetsScopes.SPREADSHEETS_READONLY

              于是我把它改成了SheetsScopes.SPREADSHEETS,删除了项目目录下的Token文件夹,再次运行程序,就成功了。

              【讨论】:

                【解决方案9】:
                1. 确保将 DriveScopes.DRIVE 用于允许的范围: 私有静态最终列表 SCOPES = Collections.singletonList(DriveScopes.DRIVE);

                2. 确保重置令牌目录路径如下:

                   GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                           HTTP_TRANSPORT,
                           JSON_FACTORY, clientSecrets, SCOPES)
                           //.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
                           .setDataStoreFactory(new MemoryDataStoreFactory())
                           .setAccessType("offline")
                           .build();
                  

                否则它将始终使用缓存的版本。

                【讨论】:

                  猜你喜欢
                  • 2021-07-10
                  • 2015-04-06
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-07-10
                  • 2015-04-03
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-06-23
                  相关资源
                  最近更新 更多