gpt4 book ai didi

java - 使用java离线访问谷歌日历

转载 作者:行者123 更新时间:2023-11-30 07:19:49 24 4
gpt4 key购买 nike

我们有代码将我们的应用程序日历与登录用户的谷歌日历同步。该代码使用 AuthSub 和 CalendarService 类,但它不提供使用访问 token 和刷新 token 对谷歌日历的离线访问,因为我想使用日历类使用 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 进行离线访问的方法,这样我就不必对代码进行太多更改。希望得到快速答复。

谢谢-德拉维古普塔

最佳答案

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 控制台启用 google calendar api。

我给你一个示例代码来验证用户并显示他拥有的日历你必须存储你在输出中获得的刷新 token 并存储它以便你可以离线访问日历。

以下函数用于 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 添加值。所有这些值都在您的 google api 控制台中。

授权功能将我转发到授权网址,该网址为我提供访问 token 和刷新 token 。但是,访问 token 会在一段时间后过期。因此,如果您想要访问 token ,则需要存储刷新 token 并在您访问日历 API 时使用它生成它。

以下函数生成访问 token 和刷新 token ,并打印用户谷歌日历中的日历列表。

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());
}}

如果您查看上面的函数,它会生成访问 token 和刷新 token 。如果您想再次生成访问 token ,请使用此函数:

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;
}

将刷新 token 存储在某处,您可以执行日历文档中提到的所有操作。在这里找到它

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

关于java - 使用java离线访问谷歌日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14393518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com