![](/img/trans.png)
[英]Google Admob API - Java client - com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
[英]com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
我正在尝试将文本文件上传到我的 Google Drive 帐户。 无论如何,我总是遇到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());
}
}
我的项目构建路径中有以下 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-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 的项目。
现在我应该在哪里正确设置权限来解决这个问题?
另外,我在这里做错了什么?
我遇到了同样的问题,我做了以下更改并解决了问题
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");
当您更改 SCOPE 并继续使用旧令牌时会发生此问题。 只需删除 StoredCredential 文件。 主意
经过长时间的搜索,我发现这个答案隐藏在搜索引擎中:
将定义范围的行更改为:
private static final List<String> SCOPES = Arrays.asList(GmailScopes.MAIL_GOOGLE_COM);
我刚刚遇到了这个问题,很可能您使用不允许插入文件的范围创建了凭证文件。 删除凭证文件并重新运行。
几个月来一直有相同的配额错误。 尝试了一切。 看起来像谷歌方面的问题。 在所有 google 产品中,Calendar API 没有任何方式支持他们的团队。 如果有人知道或已经能够就 Calendar API 联系 Google 团队,请告诉我们!
对我来说问题是SCOPES ,它被设置为SheetsScopes.SPREADSHEETS_READONLY 。
所以我将其更改为SheetsScopes.SPREADSHEETS ,删除项目目录中的 Token 文件夹并再次运行该程序,它起作用了。
对我来说,问题是 url 是 http...,它应该是 https...
我有同样的问题,但在我的情况下解决这个问题:
private static final List<String> SCOPES =
Arrays.asList(DriveScopes.DRIVE);
并创建一个新目录
private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".credentials/2/drive-java-quickstart.json");
我解决了这个问题
确保将 DriveScopes.DRIVE 用于允许的范围:private static final List SCOPES = Collections.singletonList(DriveScopes.DRIVE);
确保重置令牌目录路径如下:
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();
否则它将始终使用缓存版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.