どもども。先週の記事「ApexからGoogle Calendarを操作する」の続きです。
といっても厳密には続いてないんですが。。。(^^;
★Google Data API Toolkitのお話
さて、先週の記事ではぶつぶつ文句を言いながらも、「Toolkitで一通りカレンダーいじれるんじゃないの?」という結論に達しました。
しかし、今週になってやっぱり使うのを止めました。(--
イベント作成時に使用するオブジェクトが何故かSalesforceのEventオブジェクトでなんかビミョーという話は前回さんざんしましたが、実際のところはタイトル、日時、場所、説明さえ設定できれば良かったのでそれで事足りるはずだったんです。
なのに、実際に試してみると何故か場所が設定されない。。。
あれ、なんでだ?自分のコードではちゃんとEvent#Locationに値を設定してるし。。。
。。。
。。。て、CalendarService#insertEventsで引数に渡したLocationがコピーされてねー!
そらあかんわ。。。(--
□□□□
さて、どうしたものか?
直接修正するなら1行で直せる程度のものですが、それも気が進まない。
とりあえず元のリポジトリを探してみたところ。。。
https://code.google.com/p/apex-google-data/
うーん、もう3年近くメンテされた形跡が無い。。。
その間にAPIもXMLベースのV2からRESTベースのV3に変わっているわけで、これはもうこの先も放置なんだろうなぁ。。。(--
★V3 APIの使用を検討してみる
さてさて、ソースまるごとフォークして自分でメンテすることも考えましたが、それやろうとすると直したいところが多すぎる。(--
それに今は面倒なXMLを使わなくてもお手軽にRESTで実行できるV3 APIがあるんだよ!
ということでとりあえずV3のドキュメントを読んでみることにしました。
https://developers.google.com/google-apps/calendar/
うん、やっぱりReference見ただけでもV2よりもはるかに簡単に使えそう。それにDeprecation Policy見ると旧APIは2015年4月までは使えるけど、そっから先は知らん!と書いてるようにも思えるしこれはやっぱりどうでもV3を使うべきでしょう。
★Service Account認証
とりあえずApex用のV3ライブラリを探してみるけど、どうも無いっぽい。まぁ「Salesforce Google API」みたいなワードで検索すると一撃でSalesforce公式(?)っぽいToolkitのページが見つかるからその先に踏み込む人もあんまりいないんだろう。。。2015年4月以降をどうやって乗り切るつもりかは知らないけど。。。(--
V3 APIをざっと眺めるかぎり少なくともAPI本体のREST部分はものすごくシンプルなので自分で作るとしてもそんなにたいしたことはなさそう。
問題は認証部分。
V3 APIではClientLoginは廃止されたので今までのように気軽に個人のユーザーアカウントとパスワードでログインしてAPIをたたくことはできない。
そうはいってもサーバーアプリの場合ユーザーとは無関係の固定のアカウントでAPIを叩きたい場合も多い訳で、そういう場合はService Account認証というのを使うらしい。
https://developers.google.com/accounts/docs/OAuth2ServiceAccount
これは連携用のアプリケーションを登録して、そこで発行されたClientIDとPrivateKeyを使用して認証するという方法らしい。
下に詳細な実行手順が書かれているけど要するに
- JSONで認証用の文字列(JWTというらしい)を組み立てて、
- Base64でエンコードして、
- 電子署名を追加して、
- Http POSTで投げる
とすれば良いらしい。(どうでもいいんだけどこれもOAuth2の一種なの?一般的なOAuthとまったく類似点が無い気がするんだけど。。。)
ドキュメント読んでると3回位「悪いことは言わないから自分で実装したりせずに既存のライブラリ使っとけ!」と、言われるんだけどApex用のライブラリは無いんだよ。。。(--
ApexにもJSON、EncodingUtil、Crypto、と必要な道具立ては揃ってるっぽいから多分作れるんじゃないかな?
。。。とりあえず作ってみるか!
★で、作ってみた
けど無理でした。。。(--
認証文字列を作るところは良いんだけど最後の最後で署名が。。。(--
ここではSHA256withRSAで電子署名する必要があるんだけど、ApexのCrypto#signではSHA1withRSAでしか署名できないという罠。。。(--
マジでかー(--
ここさえ突破すれば終わりなのにこれはどうしようもねーよ。。。
どうしよう。。。
。。。しょうがないから、外に署名だけするサーバー建てるか。。。
★まさかのHeroku登場
作りました。
https://github.com/shunjikonishi/sign-server
ホントにPOSTされた文字列に電子署名して返すだけのアプリ。HerokuにpushしてConfigにBase64エンコードした秘密鍵を設定すれば使えます。
。。。(^^;;;
なんたるリソースの無駄遣い!数年前にはここまで単機能のサーバを気軽に作る日が来るとは思いもしなかったよ。
さすがにちょっとやりすぎなんじゃないの?という気がしなくもないけど、このアリサマはSalesforceがSHA256をサポートしていないのが原因なんでまぁいいか。(^^;
ということで、一応動くGoogle Calendar API V3のラッパーを作ることができました。
https://github.com/shunjikonishi/apex-google-api
次回はこいつの使い方を解説します。(^^v
□□□□
蛇足
実はSalesforceにもJWTを使った認証があるということを今回調べてて知りました。
SalesforceのAPIはIDとPassword(とSecurityToken)の認証で普通に使えるからこれ使う人いるのか?という疑問はまぁおいとくとしてもそこではSHA256での検証もやってるっぽい。
そこまでやってるなら後はそれをCryptoにもぶちこめば良いだけなんでとっととやって欲しい。。。(--
たったそれだけでGoogle V3 APIが自由に使えるかどうかが変わってくるんだからホント頼むよ。。。m(_ _)m