java - 无法从其他 Gmail 帐户获取 Calendar API v3 的事件列表

标签 java google-calendar-api

我正在尝试使用 Google Calendar API v3 从另一个 Google 帐户(而不是从我的计算机中的登录用户)检索事件列表。 即使我尝试“填写”用户帐户电子邮件,我收到的事件列表也仅来自计算机中的登录用户。 我应该做什么?

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package us.com.manga;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.GeneralSecurityException;
import java.util.Arrays;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.api.services.calendar.Calendar;
import com.google.api.services.calendar.model.Event;
import com.google.api.services.calendar.model.Events;
import java.util.List;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.client.util.DateTime;

import com.google.api.services.calendar.CalendarScopes;
import com.google.api.services.calendar.model.*;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

/**
 *
 * @author robert bones
 */
public class NewServlet extends HttpServlet {





    private static final String APPLICATION_NAME
            = "Google Calendar API Java Quickstart";

    /**
     * Directory to store user credentials for this application.
     */
    private static final java.io.File DATA_STORE_DIR = new java.io.File(
            System.getProperty("user.home"), ".credentials/calendar-java-quickstart");

    /**
     * Global instance of the {@link FileDataStoreFactory}.
     */
    private static FileDataStoreFactory DATA_STORE_FACTORY;

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

    /**
     * Global instance of the HTTP transport.
     */
    private static HttpTransport HTTP_TRANSPORT;

    /**
     * Global instance of the scopes required by this quickstart.
     */
    private static final List<String> SCOPES
            = Arrays.asList(CalendarScopes.CALENDAR_READONLY);

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

    /**
     * Creates an authorized Credential object.
     *
     * @return an authorized Credential object.
     * @throws IOException
     */
    public  Credential authorize() throws IOException {
        // Load client secrets.
        //InputStream in
        //        = NewServlet.class.getResourceAsStream("/client_secret.json");
        InputStream in = this.getServletConfig().getServletContext().
                getResourceAsStream("/WEB-INF/client_secret.json");
        GoogleClientSecrets clientSecrets
                = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow
                = new GoogleAuthorizationCodeFlow.Builder(
                        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(DATA_STORE_FACTORY)
                .setAccessType("offline")
                        .setClientId("xxxx@gmail.com")
                .build();
        Credential credential = new AuthorizationCodeInstalledApp(
                flow, new LocalServerReceiver()).authorize("xxxxx@gmail.com");

        System.out.println(
                "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
    }

    /**
     * Build and return an authorized Calendar client service.
     *
     * @return an authorized Calendar client service
     * @throws IOException
     */
    public  com.google.api.services.calendar.Calendar
            getCalendarService() throws IOException {
        Credential credential = authorize();
        return new com.google.api.services.calendar.Calendar.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // Initialize Calendar service with valid OAuth credentials
//Calendar service = new Calendar.Builder(httpTransport, jsonFactory, credentials)
        //  .setApplicationName("applicationName").build();
// Iterate over the events in the specified calendar
        String pageToken = null;
        response.setContentType("text/html;charset=UTF-8");
         try (PrintWriter out = response.getWriter()) {
                    /* TODO output your page here. You may use following sample code. */
                    out.println("<!DOCTYPE html>");
                    out.println("<html>");
                    out.println("<head>");
                    out.println("<title>Servlet NewServlet</title>");
                    out.println("</head>");
                    out.println("<body>");

                    do {
            Events events = getCalendarService().events().list("primary").setPageToken(pageToken).execute();
            List<Event> items = events.getItems();
            for (Event event : items) {


                    out.println("<h1>" + event.getSummary() + "</h1>");

                }


            pageToken = events.getNextPageToken();
        } while (pageToken != null);

                    out.println("</body>");
                    out.println("</html>");
         }

    }



}

提前致谢。

最佳答案

当您进行身份验证时,您的应用程序可以访问经过身份验证的用户有权访问的所有信息。

示例:

如果我验证您的申请,您将有权阅读我的 Google 日历。以及任何公共(public)日历,例如美国的假期。 (后者是公共(public)数据,您无需经过身份验证即可访问它)

我对您的应用程序进行身份验证后,不会让您或我访问 Jon Snow 的 Google 日历帐户(这是他的私有(private)数据)。

答案:

您只能访问经过身份验证的用户有权访问的数据。不是其他人的数据。

你应该做什么

要求其他用户向您正在验证的用户授予对其日历的访问权限。

关于java - 无法从其他 Gmail 帐户获取 Calendar API v3 的事件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35788488/

相关文章:

java - 如何更新选项卡中的 ListView ?

java - 建立预约网站的最简单方法是什么?

android - Android 4 模拟器中的日历

google-api - Google 日历事件描述中的 HTML 格式文本

java - Swing 或 AWT 库中具有灵活大小的类

java - 在 Ubuntu 上执行 Java 会产生乱码输出

java - 如何使用rabbitmq java客户端从队列中检索unack消息

java - 如何从 Mono<Boolean> 类型字段中提取值?

c# - 在 Google(日历事件).Net API 中获取 "Show me"可用/忙碌值

android - 无法从 Android 中的日历中删除提醒