标签: google-api-java-client

OAuth Google API for Java无法冒充用户

我想模仿用户并代表他们从服务器进程向用户Google Drive添加文件.我已经设置了一个服务帐户,可以使用以下代码成功访问驱动器作为服务帐户添加和列出文件等:

  /** Global instance of the HTTP transport. */
  private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  /** Global instance of the JSON factory. */
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();

  public static void main(String[] args) {
    try {
        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .build();
        Drive drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();         
        drive.files().list().execute();
  } catch (Exception e) {
     e.printStackTrace();
  }
Run Code Online (Sandbox Code Playgroud)

这有效,但只返回与我假设与服务帐户驱动器(?)关联的文件.

根据JavaDoc,GoogleCredential还可以通过添加服务帐户用户电子邮件地址来模拟用户,如下所示:

        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12")) …
Run Code Online (Sandbox Code Playgroud)

java oauth-2.0 google-api-java-client google-drive-api

9
推荐指数
1
解决办法
6896
查看次数

StorageServiceAccountSample应用程序报告"未找到KeyStore JKS实现"

StorageServiceAccountSample的第一行

HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Run Code Online (Sandbox Code Playgroud)

导致"找不到KeyStore JKS实现":

W/System.err(20142): java.security.KeyStoreException: java.security.NoSuchAlgorithmException: KeyStore JKS implementation not found
W/System.err(20142):    at java.security.KeyStore.getInstance(KeyStore.java:119)
W/System.err(20142):    at com.google.api.client.util.SecurityUtils.getJavaKeyStore(SecurityUtils.java:48)
W/System.err(20142):    at com.google.api.client.googleapis.GoogleUtils.getCertificateTrustStore(GoogleUtils.java:74)
W/System.err(20142):    at com.google.api.client.googleapis.javanet.GoogleNetHttpTransport.newTrustedTransport(GoogleNetHttpTransport.java:55)
Run Code Online (Sandbox Code Playgroud)

当我读到Android不支持JKS时,我应该如何修改此方法来解决它?

android google-api-java-client

9
推荐指数
1
解决办法
7004
查看次数

使用Java通过API写入GoogleSheet

我正在尝试使用带有Java的Google Sheet API将值写入单元格.为了阅读,我使用了Java Quickstart的指南,它对我来说很好.

要写入Google表格,我使用:

service.spreadsheets().values().update(spreadsheetId, "Sheet1!A4:H", response).execute();
Run Code Online (Sandbox Code Playgroud)

运行时此函数输出以下错误:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Request had insufficient authentication scopes.",
    "reason" : "forbidden"
  } ],
  "message" : "Request had insufficient authentication scopes.",
  "status" : "PERMISSION_DENIED"
}
Run Code Online (Sandbox Code Playgroud)

作为我正在使用的身份验证范围

private static final List<String> SCOPES = Arrays.asList(SheetsScopes.SPREADSHEETS);
Run Code Online (Sandbox Code Playgroud)

java google-api google-api-java-client google-sheets-api

9
推荐指数
1
解决办法
3713
查看次数

Google Webmasters API for Java返回空站点列表

我编写了一个简单的网站列表查询代码,该代码使用Oauth和基于Google 文档的服务帐户.正在使用的身份验证密钥文件(.p12)以及帐户都是有效的.

问题是站点列表方法返回一个空列表.

service.sites().list().execute();
Run Code Online (Sandbox Code Playgroud)

此外,如果我明确尝试通过调用获取经过验证的站点的站点地图

service.sitemaps().list("my.sample.site.com").execute();
Run Code Online (Sandbox Code Playgroud)

我收到了403 Forbidden - "用户没有足够的权限访问'sample.site.com'.另请参阅:https://support.google.com/webmasters/answer/2451999." 来自API的错误.

根据我的调试,API完美地加载密钥文件(.p12)并管理访问令牌等没有问题.

尽管如此,我的服务帐户身份验证可能存在问题.

依赖关系:

<dependency>
  <groupId>com.google.apis</groupId>
  <artifactId>google-api-services-webmasters</artifactId>
  <version>v3-rev6-1.20.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

示例代码:

package webmastertools;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.webmasters.Webmasters;
import com.google.api.services.webmasters.WebmastersScopes;
import com.google.api.services.webmasters.model.SitesListResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.File;
import java.util.Collections;

public class GoogleWebmastersClient {

    static Log logger = LogFactory.getLog(GoogleWebmastersClient.class);

    public static void main(String args[]) {

        try {

            HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
            JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
            String …
Run Code Online (Sandbox Code Playgroud)

java google-webmaster-tools oauth-2.0 google-api-java-client google-oauth

8
推荐指数
1
解决办法
955
查看次数

无法使用Google日历Api阻止空间

这是我的java代码使用此代码我正在尝试创建具有房间的事件(房间是使用资源Google Calendar API添加的)事件创建成功完全与房间A.但是,当我检查谷歌日历并尝试查看可用房间在那个房间是可用的.我希望它不应该显示或它应该显示与罢工可以任何人请告诉我这个问题的解决方案我在做错误是有许可问题请建议我.

public class CalendarQuickstart {

 private static final String APPLICATION_NAME = "API Quickstart";


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


 private static FileDataStoreFactory DATA_STORE_FACTORY;


 private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();


 private static HttpTransport HTTP_TRANSPORT;

 private static final List < String > SCOPES = Arrays.asList(CalendarScopes.CALENDAR);

 static {
     try {
         HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
         DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
     } catch (Throwable t) {
         t.printStackTrace();
         System.exit(1);
     }
 }



 public static Credential authorize() throws IOException {
     // Load client secrets. …
Run Code Online (Sandbox Code Playgroud)

google-calendar-api google-api google-api-java-client service-accounts google-admin-sdk

8
推荐指数
1
解决办法
533
查看次数

如何通过Google Play API将Android和Android TV APK上传到Google Play

背景

Android应用程序有2个版本:1个用于移动设备,1个用于Android TV.
Android TV APK版本代码应远远高于移动设备Android APK版本代码.
APK for mobile devices有版本代码,如10,11,12等
.APK为Android TV设备有版本代码,如10001,10010等.

由于这两个APK都是通过Google Play中的一个应用配置发布的,因此我们有"共享"alpha/beta曲目.当我们发布时,我们只保留多个APK(1个用于电视和1个移动设备).

我想使用Google Play API使用Gradle插件Jenkins插件将APK上传到Google Play alpha/beta曲目.
我选择哪种方法并不重要,当我尝试上传移动设备的APK时,我收到错误.

上传失败: - 如果符合以下条件,则此应用版本为10002的设备将降级为版本54:[(API_LEVEL在范围19-0和RELEASE_TRACK中包含[[BETA]]和SCREENS中的任何一个,其中包含任何一个[[small,normal,large,xlarge]]和NATIVE_PLATFORM包含[[x86_64,x86,armeabi-v7a,arm64-v8a]]和GL_ES_VERSION中的任何一个,范围为131072-0 AND FEATURES包含所有[android.hardware] .screen.portrait,android.software.leanback,android.hardware.faketouch])].

此错误明确表示我无法上传带有54版本代码(移动设备)的APK,因为带有10002版本代码(Android TV)的APK已经在Google Play中.
Google Play允许我手动完成此操作(通过Google Play控制台用户界面) - 使用APK(54版本代码)创建测试版并保留现有的APK测试版(10002版本代码).

是否可以通过Google Play API上传适用于移动设备和Android电视设备的APK?
有没有办法上传APK移动设备到alpha/beta轨道并自动保留APK从alpha/beta轨道上传之前有?

android apk google-api-java-client google-api-client

8
推荐指数
1
解决办法
733
查看次数

如何获得访问 Google Play 开发者 API 的授权

我正在尝试访问 Google Play 开发者 API https://developers.google.com/android-publisher/为我的公司应用程序构建一个应用内购买产品。

我们必须获得授权才能对 Google Play 开发者 API 进行 GET 调用。https://developers.google.com/android-publisher/api-ref/purchases/subscriptions/get

我遵循了此处介绍的步骤。https://developers.google.com/android-publisher/authorization

在此处输入图片说明

创建了一个 Oauth 客户端和服务帐户。我使用的 gmail 帐户是 play.google.com 控制台中“用户和权限”的一部分。

但是当我尝试访问 API 时,出现错误 在此处输入图片说明

当我开始搜索这个错误时,我了解到在 play.google.com 中还有一个叫做“API 访问”的东西。当我试图访问它时,我看到的只是 在此处输入图片说明

但是我在其他帖子中看到存在一个屏幕,其中包含诸如https://i.stack.imgur.com/Hdjjy.png 之类的详细信息

那么我该如何继续访问 API。我做了谷歌文档中提到的所有事情,但没有奏效。此外,我无权查看“API 访问”屏幕。

我也很困惑,如果您可以从“API 访问”屏幕和 console.developers.com 的“凭据”屏幕创建服务帐户,应该使用哪一个?

google-api in-app-purchase google-api-java-client google-play google-play-developer-api

8
推荐指数
1
解决办法
5359
查看次数

升级到Appengine 1.6.6后的VerifyError; 无法创建UrlFetchTransport的实例 - google-api-java-client 1.8.0/1.9.0-beta

升级后出现此错误:

java.lang.VerifyError :(类:com/mydomain/server/webservices/OAuth2Utils,方法:newFlow签名:()Lcom/google/api/client/googleapis/auth/oauth2/GoogleAuthorizationCodeFlow;)函数的不兼容参数

不确定这可能是相关的,但有关我的环境的一些信息:

Linux n53sv 3.2.0-24-generic#38-Ubuntu SMP Tue May 1 16:18:50 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux java version"1.6.0_31"Java(TM)SE运行时环境(版本1.6.0_31- b04)Java HotSpot(TM)64位服务器VM(内置20.6-b01,混合模式)

更新:

我把问题剥离到了最低限度,这真的令人难以置信.我创建了一个类BadClassTest,并在Servlet中创建了一个BadClassTest实例.当我的BadClassTest看起来像这样:

public class BadClassTest {

    public BadClassTest() {
        com.google.api.client.http.HttpTransport HTTP_TRANSPORT = new com.google.api.client.extensions.appengine.http.urlfetch.UrlFetchTransport();
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我可以创建一个实例.

当我的BadClassTest看起来像这样:

public class BadClassTest {

    com.google.api.client.http.HttpTransport HTTP_TRANSPORT = new com.google.api.client.extensions.appengine.http.urlfetch.UrlFetchTransport();

    public BadClassTest() {
        //com.google.api.client.http.HttpTransport HTTP_TRANSPORT = new com.google.api.client.extensions.appengine.http.urlfetch.UrlFetchTransport();
    }

}
Run Code Online (Sandbox Code Playgroud)

现在无法创建BadClassTest的实例.我遇到以下异常:

java.lang.VerifyError :(类:com/klawt/server/BadClassTest,方法:签名:()V)putfield/putstatic中的错误类型

google-app-engine verifyerror google-api-java-client

7
推荐指数
1
解决办法
886
查看次数

从 Google Drive API 获取操作项列表


嗨,大家好。

我一直在尝试使用 Google Drive API 来获取一个列表,其中包含使用 Spring Boot 和我公司域中所有文件(文档或电子表格)中分配的操作项google-api-services-drive,但我遇到了一些问题:

  • 看起来 API 上没有关于操作项的内容。
  • 评论是我能得到的最接近的,但它们不包括操作项信息。他们只有被提及的人的电子邮件。
  • 文档看起来广泛而不精确。例如,这里他们说文件资源包含一个indexableText属性,但它不存在于响应中。
  • Term for followup 中所述,查找 actionitems您可以应用查询来获取包含 action items 的文件。为什么该fullText字段在响应中不可用,或者某些其他等效属性无法查看实际内容并将其用作获取操作项的解决方法?

我只需要从评论中知道谁被分配到操作项。

有任何想法吗?

google-api google-api-java-client google-drive-api google-drive-shared-drive

7
推荐指数
1
解决办法
436
查看次数

使用服务帐号从 Google 域中获取用户列表


大家好。

我被分配了使用 Spring Boot 从 Google 域的每个成员的收件箱中获取未答复电子邮件的任务,但我无法做到。

首先,我需要域中的用户列表。这可以通过 Directory API 实现(顺便说一下,它不能在 Google Developer Console 中通过该名称启用。看起来它属于 Admin SDK 左右)。

到目前为止我所面临的是:

  • SO上有很多相关的问题,但大多数已经过时了。
  • Java Quickstart for Google Directory API 不包含使用服务帐户的示例,我想使用它们,因为我的应用程序在 docker 容器中运行,而使用 Oauth 意味着我每次部署新版本或重新启动时都需要手动授权它容器。
  • Google 文档参考了管理控制台中的“API 参考”设置,但我在那里没有看到该部分。

我没有将凭据存储在 JSON 文件中,而是将它们存储在环境变量中。我正在这样做:

var inputStream = IOUtils.toInputStream(apiCredentials, Charset.defaultCharset());  //apiCredentials is a string with the JSON contents.
var credential = GoogleCredential
                .fromStream(inputStream, httpTransport, JacksonFactory.getDefaultInstance())
                .createScoped(Collections.singleton(DirectoryScopes.ADMIN_DIRECTORY_USER));
var directoryService = new Directory.Builder(httpTransport, JacksonFactory.getDefaultInstance(), credential)
                .setApplicationName("My App")
                .build();
var result = directoryService.users().list()
                    .setPageToken(pageToken)
                    .setDomain("my.domain")
                    .setMaxResults(10)
                    .execute();
Run Code Online (Sandbox Code Playgroud)

在此之后,我收到一个400 Bad request …

google-api google-api-java-client service-accounts spring-boot

7
推荐指数
0
解决办法
65
查看次数