Java 无法从其他Gmail帐户获取日历API v3的事件列表

Java 无法从其他Gmail帐户获取日历API v3的事件列表,java,google-calendar-api,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 | Templat

我正在尝试使用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>");
         }

    }



}

提前感谢。

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

示例:

如果我验证你的应用程序,你将有权阅读我的谷歌日历。以及任何公共日历,如美国的假日(后者是公共数据,您无需通过身份验证即可访问)

我对您的应用程序进行身份验证不会让您或我访问Jon Snow的谷歌日历帐户,该帐户是他的私人数据

回答:

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

你应该怎么做


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

当您进行身份验证时,它允许您的应用程序访问通过身份验证的用户有权访问的所有信息

示例:

如果我验证你的应用程序,你将有权阅读我的谷歌日历。以及任何公共日历,如美国的假日(后者是公共数据,您无需通过身份验证即可访问)

我对您的应用程序进行身份验证不会让您或我访问Jon Snow的谷歌日历帐户,该帐户是他的私人数据

回答:

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

你应该怎么做


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

您登录的用户是否有权查看其他用户的日历?@JimGarrison否,我登录的用户不知道/看不到有关这些其他用户日历的任何信息。那么您为什么希望这样做?您登录的用户是否有权查看其他用户的日历?@JimGarrison否,我登录的用户不知道/看不到关于这些其他用户日历的任何信息。那么,为什么您希望这样做有效?