当前位置: 首页 > 知识库问答 >
问题:

服务帐户上的Java Google日历API“access _ denied”

上官鸿朗
2023-03-14

我正在尝试使用JavaGoogleCalendarAPI连接到日历。java应用程序使用服务帐户。

我有以下代码:

   java.io.File licenseFile = new java.io.File("39790cb51b361f51cab6940d165c6cda4dc60177-privatekey.p12");

   GoogleCredential credential = new GoogleCredential.Builder()

  .setTransport(HTTP_TRANSPORT)
  .setJsonFactory(JSON_FACTORY)
  .setServiceAccountId("xxx@developer.gserviceaccount.com") 
  .setServiceAccountUser(EMAIL_ADRESS)
  .setServiceAccountScopes(CalendarScopes.CALENDAR)
  .setServiceAccountPrivateKeyFromP12File(licenseFile)
  .build();

  client = new com.google.api.services.calendar.Calendar.Builder(
                        HTTP_TRANSPORT, JSON_FACTORY, credential)
                        .setApplicationName("Google Calendar Sync").build();

  Calendar calendar = client.calendars().get(EMAIL_ADRESS).execute();

在最后一行,我得到一个IOException消息:

ex = (com.google.api.client.auth.oauth2.TokenResponseException) com.google.api.client.auth.oauth2.TokenResponseException: 400 错误请求 { “error” : “access_denied” }

我dubble检查了GoogleCredential对象的值,它们是正确的。我还在我的域控制台中添加了https://www.google.com/calendar/feeds/,·http://www.google.com/calendar/feeds/,应用程序id为client,以授权第三方应用程序访问

我忘了一步吗?

共有3个答案

澹台镜
2023-03-14

我让它起作用了

我不知道为什么,但我删除了这行

.setServiceAccountUser(EMAIL_ADRESS)

我还在域范围内添加了一个额外的url:

https://apps-apis.google.com/a/feeds/calendar/resource/#readonly

并删除了一个不起作用的链接。

最后,我将客户端声明中的Application ationName更改为与api控制台中的名称相同

client = new com.google.api.services.calendar.Calendar.Builder(
                        HTTP_TRANSPORT, JSON_FACTORY, credential)
                        .setApplicationName("HolidaySyncs").build();

经过这些步骤,它开始工作。

另外请注意,在我这样做之后,我有以下错误:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "notFound",
    "message": "Not Found"
   }
  ],
  "code": 404,
  "message": "Not Found"
 }
}

我通过更改例如:

Event result = client.events().insert(<EMAIL ADRESS>, event).execute();

Event result = client.events().insert("primary", event).execute();

首先,我认为谷歌服务器有问题,但显然当你尝试链接到日历ID时,它会出错。因此,链接到“主要”(即帐户的主要日历)是有效的。但根据文档,当您引用特定的日历ID(其中电子邮件地址是主日历)时,它也应该起作用。可能是一个错误?

更新:在这些代码更正之后,我仍然有问题。阅读已接受的答案以获取更多信息。

寇照
2023-03-14

我愿意:

List find = client.events().list(EMAIL_ADRESS);
DateTime timeMin = new DateTime(DateUtil.stringToDate("01/01/2013"));
DateTime timeMax = new DateTime(DateUtil.stringToDate("01/02/2013"));

find.setTimeMin(timeMin);
find.setTimeMax(timeMax);

   try{
       Events events = find.execute();
       int i =0;

       while (true) {
           System.out.println("Page: "+(++i)+": "+events.getItems().size());
         for (Event event : events.getItems()) {
           System.out.println(event.getSummary());
         }
         String pageToken = events.getNextPageToken();
         if (pageToken != null && !pageToken.isEmpty()) {
           events = client.events().list(EMAIL_ADRESS).setPageToken(pageToken).execute();
         } else {
           break;
         }
       }

       }catch(GoogleJsonResponseException e){
           System.out.println(e.getMessage());
//         e.printStackTrace();
       }
燕寒
2023-03-14

api尚未完成。更具体地说,服务帐户部分。

日历所有者需要授予应用程序在其日历设置中读取/写入日历的权限。它可以在日历的共享设置中找到,您可以在那里添加帐户的电子邮件地址并在您的日历上授予它们权限。

因此,在这种情况下,我必须补充:xxx@developer.gserviceaccount.com应用程序需要访问的日历的权限/共享列表。

我还删除了另一篇由于上述问题而无法完全工作的帖子。我会取消删除它,因为它包含一些代码片段,将来可能会帮助其他人。但请注意权限问题和不支持Google日历的服务帐户

 类似资料:
  • 我正在使用Google. net客户端库来访问谷歌日历应用编程接口。我需要研发创建日历事件并将其发布给用户的应用程序。 这是一个服务器到服务器的应用程序,所以我创建了一个服务帐户,并用它来发送邀请。当从web浏览器提交响应时,创建的与会者对这些事件的响应将被更新,但当来自outlook等任何邮件客户端的响应时,响应将以电子邮件的形式发送给服务帐户电子邮件id(这是一个虚拟电子邮件id)。如何将有效

  • 我收到了这个错误 已经跟踪了https://developers.google.com/admin-sdk/directory/v1/guides/delegation 我使用这个库,并在laravel 5.7:https://github.com/spatie/laravel-google-calendar上运行它 有什么办法可以解决这个问题。请帮忙。

  • 我正在尝试通过服务帐户(客户端电子邮件和p12证书)连接到google doubeclick api,使用python客户端库,如以下示例所示: http://code.google.com/p/google-api-python-client/source/browse/samples/service_account/tasks.py 它给我一个空access_token: 这有什么意义?我有没

  • 我想用gmail API阅读我的gmail收件箱。我需要使用服务帐户,因为我的应用程序没有用户交互。我在请求时收到以下错误: 这是我的代码: 我做错了什么?有人能帮我吗? 当做

  • 因此,我已将服务号设置为域范围的授权,如本文所述执行谷歌办公套件域范围的授权。在谷歌办公套件管理控制台中,我已授权服务号使用OAuth 2.0范围: 每次我试图创建一个事件,最终都会出现这个错误 这建立了google凭据,不使用模拟,日历与服务号共享。

  • 问题内容: 我正在尝试使用服务帐户在Google日历上创建条目。我真的很接近,但是最后一行是行不通的。我让它运行时得到提示。否则,程序将毫无错误地运行,无论花费多少。 该文件的内容可以发现在这里。在我试图调用方法开始在该文件上的1455线。 问题答案: 我想通了。由于我看不到将服务帐户与API v3一起使用的完整示例,因此我将发布完整的解决方案以供参考。但是,除了实现代码外,还需要做一些事情: 1