用java谷歌日历的离线访问(Offline Access to google calendar u

2019-07-18 09:14发布

我们有代码同步与我们的登录用户的谷歌日历应用的日历。 该代码使用AuthSub和CalendarService类,但使用访问令牌和刷新令牌,我想使用日历类使用OAuth V3它并没有提供谷歌日历离线访问。 我面临的问题,我的老代码合并,这是没有getFeed()函数的新V3 Calendar类。 这里是我的应用程序的一些代码

if(StringUtil.isValid(request.getQueryString())) {
                onetimeUseToken = AuthSubUtil.getTokenFromReply(request.getQueryString());
            }       

            if(StringUtil.isValid(onetimeUseToken)) {           

                    String sessionToken = AuthSubUtil.exchangeForSessionToken(onetimeUseToken,null);
                    CalendarService calendarService = new CalendarService("myapp");
                    calendarService.setAuthSubToken(sessionToken, null);    
                    session.setAttribute("calendarServicesession",calendarService);
                    userIDforCalendar = (String) session.getAttribute("calendar_user_no");
                        }

                       CalendarFeed myResultsFeed1 =service.getFeed(new URL("https://www.google.com/calendar/feeds/default/allcalendars/full"),CalendarFeed.class);

            for (int i = 0; i < myResultsFeed1.getEntries().size(); i++) {
                CalendarEntry entry = myResultsFeed1.getEntries().get(i);
                           .....

}

请给我提供一些方法使用CalendarService这样我就不必太大改变我的代码给离线访问。 希望得到快速回复。

Thanks- Dravit古普塔

Answer 1:

谷歌弃用的AuthSub 20 2012年4月所以这是一次迁移到OAuth 2.0用户和谷歌日历API第3版。 首先下载这些以下链接的jar文件:

https://google-api-client-libraries.appspot.com/download/library/calendar/v3/java

http://google-oauth-java-client.googlecode.com/files/google-oauth-java-client-1.13.1-beta.zip

从您的项目中的旧日历的AuthSub jar文件,并从这个链接添加jar文件。

然后去谷歌API控制台,让您的客户端ID,客户端密钥,并创建一个重定向URI。 而从相同的API控制台使谷歌日历API。

我给你说对用户进行认证,并表明他有你需要存储刷新令牌,在输出中获得并储存起来,这样就可以访问该日历离线日历一个示例代码。

这下面的函数是OAuth授权。

 public void authenticate(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    String client_id                = "xxxx";
    String redirect_uri             = "xxxxxx";
    String scope                    = "https://www.googleapis.com/auth/calendar";
    String client_secret            = "xxxxxx";
    List <String> scopes;
    HttpTransport transport         = new NetHttpTransport();
    JsonFactory jsonFactory         = new JacksonFactory();

    scopes = new LinkedList<String>();
    scopes.add(scope);
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(transport, jsonFactory, client_id, client_secret, scopes).build();
    GoogleAuthorizationCodeRequestUrl url = flow.newAuthorizationUrl();
    url.setRedirectUri(redirect_uri);
    url.setApprovalPrompt("force");
    url.setAccessType("offline");
    String authorize_url = url.build();
    response.sendRedirect(authorize_url);
}

你要添加值的变量client_idclient_secretredirect_uri 。 所有这些值都在你的谷歌API控制台。

授权功能转发我的授权网址,给了我一个访问令牌和刷新令牌。 然而,接入令牌的时间间隔后过期。 所以,如果你想访问令牌,你需要存储刷新令牌,并使用产生它,每当你访问日历API。

这下面的函数生成访问令牌和刷新令牌,并打印在用户谷歌日历的日历列表。

public void importCalendarList(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    HttpSession session = request.getSession();
    String staffKey = (String) session.getAttribute("staffKey");
    ContactJdo staffDetails = staff.getStaffDetail(staffKey);
    String code = request.getParameter("code");
    String calendarId="";

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(transport, jsonFactory, client_id, client_secret, scopes).build();
    GoogleTokenResponse res = flow.newTokenRequest(code).setRedirectUri(redirect_uri).execute();
    String refreshToken = res.getRefreshToken();
    String accessToken = res.getAccessToken();

    List <CalendarListEntry>list1= getCalendars(accessToken);

    for(CalendarListEntry temp:list1) {
        System.out.println(temp.getId());
    }}

如果你看一下上面的函数,它产生两种访问和刷新令牌。 如果你想令牌生成访问再次使用此功能:

public static String getAccessToken(String refreshToken, String client_id, String client_secret) throws IOException {
    HttpTransport transport         = new NetHttpTransport();
    JsonFactory jsonFactory         = new JacksonFactory();

    GoogleRefreshTokenRequest req = new GoogleRefreshTokenRequest(transport, jsonFactory, refreshToken, client_id, client_secret);
    GoogleTokenResponse res = req.execute();
    String accessToken = res.getAccessToken();
    return accessToken;
}

存储刷新令牌的地方,你可以做到这一点是日历文件中所提及的所有操作。 在此查找

https://google-api-client-libraries.appspot.com/documentation/calendar/v3/java/latest/index.html



文章来源: Offline Access to google calendar using java