离线访问谷歌日历使用java



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

中的一些代码
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离线访问,这样我就不必改变我的代码太多。希望你能尽快回复。

——谢谢你Dravit Gupta

Google从2012年4月20日起弃用AuthSub。因此,是时候迁移到OAuth 2.0和Google Calendar API v3了。首先从以下链接下载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文件。

然后转到google 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_id, client_secretredirect_uri添加值。所有这些值都在你的google api控制台。

授权函数将我转发到授权url,该url给我一个访问令牌和一个刷新令牌。但是,访问令牌会在一段时间间隔后过期。因此,如果您想要访问令牌,则需要存储刷新令牌,并在访问日历api时使用该令牌生成它。

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

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

相关内容

  • 没有找到相关文章

最新更新