JSPで行こう!

GoogleカレンダーAPI

Google の OAuth2.0 認証を書いていると、Google カレンダーでの使い方を少しまとめておこうと思い立ちました。
しばらく携わっていないと結構忘れるんです。

外部認証のところで、ログインについては、ある程度解説しましたので、
Google カレンダーと言っても、その延長です。

Google カレンダーの API を使うにあたって、どこまで行えるようにするかで「認可」の種類も変わります。
参照だけや、登録や更新も可能です。

カレンダーAPIの認証方式

APIを使うのに、OAuth2.0 しか無いような書き方だったので追記します。
API_KEY または CLIENT_ID を使っても Calendar API を実行する事ができます。
下記は、API_KEY、CLIENT_ID を使って、JavaScript だけで認証を行ってカレンダーAPIを使う Google のサンプルです。
JavaScript Quickstart
上記の例のようにリダイレクトを伴う OAuth2.0 のようにサーバー処理を必要としませんので実装が簡単です。
予め、 Google Cloud Platform でプロジェクトを作成して、クライアントID または API_KEY を発行しておく必要があります。

当初勘違いしてましたが、リンク先の例では API_KEY も使っているように見えますが、ユーザー認証を行うので CLIENT_ID しか使われていません。
API_KEY はコメントアウトしても動きます。

API_KEY が OAuth2.0 と異なるのは、実行の権限がプロジェクト(匿名)になってしまうので、個人が公開していない情報にはアクセスできません。
ですので 実用上は、Google カレンダーや Google Map 等の一部の API にしか使えません。
例えば、カレンダーでは自分のスケジュールを公に公開するというかなり勇気が必要です。
CLIENT_ID の実行はリダイレクトと同様に、認可を受け入れた個人の権限で実行されますが、リダイレクト先が必要無い代わりに利用が制限される場合があります。
制限とはアプリを「外部」に公開する場合は、Google の審査が必要で直ぐに使える訳では無いという事です。
この事はプロジェクトの作成アカウントが組織(google workspace:旧 G Suite)に属しているかどうかでも事情が変わります。
workspace の場合は、デフォルトの公開範囲が「内部」となっており、この場合は審査が不要です。
では、workspace 以外はどうかと言うと、下の通り「内部」を選択する事ができません。




ではどうするかと言えば、この画面で「本番」を「テスト」にすれば限られたアカウント(利用アカウントをここで登録する)のもとで動きます。

API_KEY の作成では、デフォルトではAPIの利用に制限がありませんが、万が一漏れた場合を考えて、利用するAPIや場所(ドメイン等)は設定しておく事をお勧めします。
詳しくは、API キーを使用する理由と条件 を参照してください。

OAuth2.0での仕様の検討

認可を伴う場合、単なる外部認証とは異なり、ここではユーザー管理を行うことが前提になります。

ログインしたユーザーが1度だけ自身で「認可」を行い、以降はログインの度に「認可」をする必要がないようにしないと、煩雑で使い難いからです。
また認可の種類は、例えばメールやカレンダー、ドライブとかいった複数ありますので、その種類ごとにも管理する必要があります。

何が必要か

まず「認可」を都度行わないということは、Google への「アクセストークン」を別の方法で取得する必要があります。
これは、「リフレッシュトークン」をサーバーサイドで保持することで解決できます。
「認可」を行った際に、リダイレクトされた先でリフレッシュトークンも取得して、保存することになります。
Cookie や LocalStrage に保存すると、同じPCのブラウザからでしか使えないので、普通はサーバー内に保持します。
クライアント側にはリフレッシュトークンは開示せず、サーバー側でアクセストークンを取得してそれをクライアント側に開示します。

仕組みはこんなものですが、リフレッシュトークンは安易に平文で保存することには抵抗があります。
関係者以外が取得できてしまうと、結構大きなセキュリティホールになりますので、
AES等で暗号化して保存しておくことをお勧めします。

あと、「認可」はいくつも種類があるので、必要であればそれごとのリフレッシュトークンの管理が必要です。
ですので、スコープも併せた保存も必要でしょう。

create table google_relations (
   user_id varchar(100)
,  scope varchar(400)
,  refresh_token varchar(400)
, update_date timestamp
)

とりあえず

ちょっとテストで1週間分のスケジュールを取得してみます。
まず、Google Cloud Console のプロジェクトで「APIとサービス」でカレンダーの操作を追加しておきます。



« 前頁 次頁 »