【Google APIs】Javaでカレンダーv3を認証画面なし(自動)で取得する(OAuth使用)

Pocket

2013/10/8追記—
このサンプルで意図するカレンダーリスト(一覧)が取得できない場合、「カレンダーの共有設定」もしくは、Google Appsユーザの場合「Appsユーザへの共有設定」が行われていない可能性があります。

参考



Google APIsのCalendar APIで、非公開のカレンダーをOAuth認証で取得するプログラムをGoogle App Engine(Java)で作成中です。

まだ実験段階なのですが、Google公式のサンプルもAPIのバージョンが古い?のであまり役に立たず・・・。検索しても、やはり古い情報しかヒットしないので試行錯誤してみました。(検索のキーワードが良くなかったのかな?)

やりたいことは、WEBアプリケーションとGoogleとのあいだの認証だけで動作させることです。
つまり、ユーザ認証画面は表示させません。

普通に作成したWeb Applicationアカウントでは実現不可?な感じでしたので、Service account」を作成して取りあえず、OAuth認証までは自動化(アカウント名とパスワード入力画面を表示させない)できたので、そこまでのコードを記載しておこうと思います。

スポンサードリンク


環境

実行環境
GAE(Google App Engine)
開発環境
Eclipse Helios R2(これより上位のバージョンはgoogleプラグインが未対応)
言語
Java
使用API
  • App Engine SDK 1.8.5(eclipseのインストール機能を利用してインストール)
  • Google Calendar API v3r64lv1.15.0-rc(Google Service and Development Toolsを利用してインストール)
  • google-api-client-1.17.0-rc.jar(google-api-java-clientから手動)
  • google-http-client-1.17.0-rc.jar(google-api-java-clientから手動)


手順

前提:App Engine SDKインストール済み

Google Calendar API v3#Set up a Client Libraryの手順通りですが念のため。

  • EclipseのGoogle Service and Development Toolsから「Add Google APIs」を選択
    gapi_eclipse

  • 「Calendar API」を選択しインストール(自動でクラスパスに追加される)

  • google-api-java-clientから最新のjarを取得してクラスパスに追加
    ※「Calendar API」にもバージョンが古いけど被ってるjarがあります。たぶん古い方でも動きますが、どちらを使うかはお好みで。


コード

※横に長くてすみません。スクロールできます。

  • import
    import java.io.File;
    import java.io.IOException;
    import java.util.Arrays;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.http.javanet.NetHttpTransport;
    import com.google.api.client.json.JsonFactory;
    import com.google.api.client.json.jackson.JacksonFactory;
    import com.google.api.services.calendar.Calendar;
    import com.google.api.services.calendar.CalendarScopes;

  • Servlet
    public class CalendarServlet extends HttpServlet {
    
    private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
    private static final JsonFactory JSON_FACTORY = new JacksonFactory();
    
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
    	throws IOException {
    
    try {
    GoogleCredential credential = new GoogleCredential.Builder()
    	.setTransport(HTTP_TRANSPORT)
    	.setJsonFactory(JSON_FACTORY)
    	.setServiceAccountId("[Service accountで作成したメールアドレス]@developer.gserviceaccount.com") // ★gmailではない
    	.setServiceAccountScopes(
    		Arrays.asList(CalendarScopes.CALENDAR)) // https://www.googleapis.com/auth/calendar
    	.setServiceAccountPrivateKeyFromP12File(new File("[Service accountを作成した時にダウンロードするプライベートキーのパス].p12")) // 例:"WEB-INF/aaa.p12"
    	.build();
    
    Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY,credential)
    	.setApplicationName("[作成したAPI名]") // GAEのアプリケーション名とは別
    	.build();
    
    // 結果を画面出力
    resp.setContentType("text/plain");
    resp.getWriter().println(
    service.calendarList().list().execute().toString());
    			
    } catch (Exception ex) {
    resp.getWriter().println(ex.toString());
    }
    }
    }

  • web.xmlにCalendarServletへのマッピングを記述

GAEにデプロイして動作確認

ローカルではNullPointerExceptionで動きません。


デプロイ後、該当URLにブラウザでアクセス。
何か表示されれば取りあえずgoogleへの問い合わせは成功。

ERRORなんちゃらって表示された場合、setServiceAccountIdやsetApplicationNameあたりの記述ミスが原因かもしれません。その際はappengineでログを見ます。たぶん判断材料になります。何も表示されない場合もログを確認。

お役に立てましたか?

ブックマークをどうぞ!

スポンサード リンク

コメントを残す