2

アプリケーションカレンダーをログインユーザーのGoogleカレンダーと同期するコードがあります。コードはAuthSubとCalendarServiceクラスを使用していますが、カレンダークラスを使用してOAuth v3を使用したい場合は、アクセストークンと更新トークンを使用してGoogleカレンダーへのオフラインアクセスを提供しません。getFeed()関数を持たない新しいv3Calendarクラスに古いコードをマージする際に問題が発生しています。これが私のアプリケーションからのコードです

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を使用してオフラインアクセスを許可する方法を教えてください。迅速な返信を期待しています。

ありがとう-ドラビットグプタ

4

1 に答える 1

5

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 カレンダー 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_secretおよびに値を追加する必要がありredirect_uriます。これらの値はすべて Google API コンソールにあります。

認証機能は、アクセス トークンとリフレッシュ トークンを提供する認証 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

于 2013-01-24T10:43:11.730 に答える