【CalendarAPI(V3)】非同期で認証する方法

517 views
Skip to first unread message

A.R

unread,
Apr 23, 2013, 12:46:34 AM4/23/13
to google-app...@googlegroups.com

カレンダーAPIのV3を使用して開発を行っていますが
認証処理に関して質問があります。

ソースコードは、一番下に記載した通りとなります。
この実装で認証は行えて、カレンダーAPI(V3)も使用できました。

しかし今回実現したい機能では、この実装方法をとることができず、悩んでおります。
その今回実現したい機能の概要は、以下の通りです。
 
  ・GAEのアプリケーション上から『非同期』でカレンダーAPIを実行する。
    (概要図は、添付ファイル「summary.bmp」を参照)
 

上記の機能を実現する場合、記載したソースコードですと、以下の問題点が生じます。

  ・ソースコードの「※1」で取得したURLにて、人の手でブラウザを立ち上げ、
    認証コードを取得し(添付「code.bmp」参照)、手入力でソースに認証コードを渡す必要がある。
   そのため、非同期処理が行えない。
 
そこで、以下のいずれかの実装が実現可能であれば、
非同期でカレンダーAPIを実行できると考えております。
 
  ① 認証コードの固定化
       ⇒一度、認証コードをアプリ外で取得し、取得した認証コードをソースに埋め込み使いまわす
 
  ② 認証コードの取得をソース内で実施
       ⇒「ブラウザ起動→認証コードの取得→認証」までをソースコード内で実行
   
  ※CLIENT_ID及び、CLIENT_SECRETはAPIコンソールで取得後、固定化されると認識しております。
 
①または、②のような実装は可能なのでしょうか?
もしくは、他の方法で、非同期処理でCalendarAPI(V3)を使用することは可能でしょうか?
可能であれば、実装方法等をご教授頂ければ大変助かります。
 
最後に補足となりますが、CalendarAPIはV3を使用することを前提としております。
(V2において、非同期処理でのAPI実行が、実装可能であることは確認しておりますが
 V2は来年末で使用できなくなるとのことで、V3で実装しようと考えております)


以上、宜しくお願い致します。


<ソースコード>

 public class CalendarCommandLine {

   private static String CLIENT_ID = "XXXXXXXXXXXXXXX";
   private static String CLIENT_SECRET = "XXXXXXXXXXX";
   private static String REDIRECT_URI = "XXXXXXXXXXXX";

   public static void main(String[] args) throws IOException {
  
      // プロキシの設定
      (割愛)

      HttpTransport httpTransport = new NetHttpTransport();
      JsonFactory jsonFactory = new JacksonFactory();

      GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET,
            Arrays.asList(CalendarScopes.CALENDAR)).setAccessType("online").setApprovalPrompt("auto").build();

      String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();     ←※1

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      String code = br.readLine();

      GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
      GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response);

      Calendar service = new Calendar.Builder(httpTransport, jsonFactory, credential).build();
   }
}

A.R

unread,
Apr 23, 2013, 12:52:27 AM4/23/13
to google-app...@googlegroups.com
自己レスです。
添付ファイルがうまく添付できなかったようなのでUPします。

summary.bmp
code.bmp

vvakame

unread,
Apr 23, 2013, 1:53:34 AM4/23/13
to google-app...@googlegroups.com
わかめです。

あまり裏を取らずに適当な事を書いてしまいますが、以下のコードを変えるとどうなるでしょうか?
setAccessType("online") を setAccessType("offline") に変える。
refresh_tokenが取れるようになればユーザの認証は一度だけで、好きな時にAccessTokenが取れるんじゃないかなーと思います。

どうでしょうか?


2013年4月23日 13:52 A.R <ncia...@nciwftest2.mygbiz.com>:
自己レスです。
添付ファイルがうまく添付できなかったようなのでUPします。


--
このメールは Google グループのグループ「Google Apps API Japan」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、google-apps-api-...@googlegroups.com にメールを送信します。
このグループに投稿するには、google-app...@googlegroups.com にメールを送信してください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

A.R

unread,
Apr 30, 2013, 4:12:47 AM4/30/13
to google-app...@googlegroups.com
返信ありがとうございます。
お返事遅れてすみません。

ご教授頂いた方法で、AccessTokenは取れませんでした。。
単純に"
offline"に変えるだけでは取れないのでしょうか?

なお、以下のURLを参考にして、AppEngineCredentialStoreクラスを使用するように
ソースを組みなおしてみたところ、Calendarクラスのサービスは取得できるようには
なったのですが、サービス実行時に以下のエラーが出てしまい、こちらの方法もうまく行きませんでした。
※このときのソースコードを参考までに添付致します。

参考:http://stackoverflow.com/questions/14430068/gae-backend-task-queue-how-to-pass-user-credentials-in-parameter

どなたかGAE上で、
最初に記載した条件で、CalendarAPIのV3を使用できた方がいらっしゃいましたら
ご教授頂けると助かります。


◆エラー内容
[s~iwfmg10/1.367033920805415995].<stdout>: 2013-04-30 16:46:51 [Request 5F5833C7] DEBUG - com.google.api.client.googleapis.json.GoogleJsonResponseException: 401
{
  "code" : 401,
  "errors" : [ {
    "domain" : "global",
    "location" : "Authorization",
    "locationType" : "header",
    "message" : "Login Required",
    "reason" : "required"
  } ],
  "message" : "Login Required"
}



2013年4月23日火曜日 14時53分34秒 UTC+9 vvakame:
わかめです。

あまり裏を取らずに適当な事を書いてしまいますが、以下のコードを変えるとどうなるでしょうか?
setAccessType("online") を setAccessType("offline") に変える。
refresh_tokenが取れるようになればユーザの認証は一度だけで、好きな時にAccessTokenが取れるんじゃないかなーと思います。

どうでしょうか?
2013年4月23日 13:52 A.R <ncia...@nciwftest2.mygbiz.com>:
自己レスです。
添付ファイルがうまく添付できなかったようなのでUPします。


--
このメールは Google グループのグループ「Google Apps API Japan」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、google-apps-api-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、google-apps-api-ja...@googlegroups.com にメールを送信してください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

test.java

A.R

unread,
May 30, 2013, 3:54:17 AM5/30/13
to google-app...@googlegroups.com
自己レスです。
 
最近APIが更新されたようで最新のAPIを取得したところ
GAE上でのCalendarAPI(V3)が無事使用できました。
 
 
以上、お騒がせしました。
 
Reply all
Reply to author
Forward
0 new messages