java com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32476746/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 20:16:04  来源:igfitidea点击:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden

javagoogle-drive-api

提问by Sandeep Chatterjee

I am trying to upload a text file to my Google Drive account. No matter what, I always encounter an com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden

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

Stacktrace:

堆栈跟踪:

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)

Here is line 69 of DriveCommandLine.java

这是第 69 行 DriveCommandLine.java

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

Complete Code:

完整代码:

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.Hymanson2.HymansonFactory;
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 HymansonFactory();

        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());
    }
}

I have the following jars in my project build path:

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

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-Hymanson2-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-Hymanson2-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
Hymanson-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

At present I have two projects set up with Drive API enabled.

目前我设置了两个启用 Drive API 的项目。

enter image description here

在此处输入图片说明

Now where do I properly set up the permissions to resolve this issue?

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

Also, what am I doing wrong here?

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

回答by Suraj Muraleedharan

I had the same issue, I did the following change and it resolved the issue

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

1) Added SheetsScopes.DRIVE to the scopes to be given in authorize()

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

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

2) Created a new directory, so that next time I run it, it will authenticate and save the credential to the newly created directory

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");

回答by Vitali Rahin

This issue happened when you change SCOPE and proceed to work with the old token. Just remove StoredCredential file.Idea

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

回答by Yster

After a long time searching, I found this answer hidden in the search engine:

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

Change the line where you define scopes to:

将定义范围的行更改为:

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

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

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

回答by user5538597

I just had this problem and it is likely that you have created the credential file using a scope that does not allow inserting a file. Remove the credential file and re-run.

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

回答by Roman

Been having same quota errors for months. Tried everything. It looks like problem on Google side. Among all google products, Calendar API does not have any way to support their team. If anyone knows or have been able to contact Google team about Calendar API, let us know!

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

回答by SpyZip

For me the problem was that the url was http... and it should be https...

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

回答by Cesarov

I had the same problem but in my case resolve this with:

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

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

from DriveScopes

来自DriveScopes

and also create a new directory

并创建一个新目录

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

and i solved the problem

我解决了这个问题