Google Apps Extensions Console を使ってアプリケーションごとにクライアントシークレットを生成する方法
私は仕事でも趣味でも、 Google Apps にアクセスするアプリをよく開発します。例えばこのブログのコメントなんかも、 GAE を経由して Google Docs に表計算データとして保存するようにしています(以前はフォーム機能で直接保存していましたが、最近スパムが酷くなったので GAE 経由に切り替えました)。
こんなときに便利なのが、独自ドメインの Google Apps で利用できる 2-legged OAuth です。面倒な OAuth の認可フローを通さずに、あらかじめ発行されたシークレットでリクエストを署名するだけで各種 API にアクセスできます。明示的に再発行しない限り expire することもないので、サーバーサイドから簡単にドメイン全体のデータにアクセスできます。
で、この 2-legged OAuth に使うシークレットを取得する方法なのですが、私が知るかぎり以下の 4 つがあります。
- ドメインキーを利用する
- アプリのドメインを Google に登録する
- Google Apps Marketplace に登録する
- Google Apps Extensions Console を使う
(1) のドメインキーは、 Google Apps の管理コンソールで発行される管理者用のシークレットです。詳細はこちらのページを参照してください。最も簡単に発行できますが、ドメインごとにひとつしか持てません。したがって、なんらかの理由でシークレットを再発行すると、すべてのアプリケーションを変更しなければいけません。
(2) はアプリケーションのドメインをこちらのページで Google に登録し、シークレットを発行する方法です。登録方法の説明はこちら。そして、 シークレットを管理コンソールで登録します。ドメインごとに別のキーを取得できますが、逆に言うとキーの数だけ(サブ)ドメインが必要です。また、シークレットの再発行ができない、一度登録したドメインは削除できないなど、使い勝手もいまいちです。
(3) は Google Apps Marketplace (以下、Marketplace)に載せるためのアプリとして登録するというものです。 Marketplace のアプリにはそれぞれに個別のシークレットが発行され、それをドメインにインストールすることで 2-legged OAuth によるアクセスが可能になります。アプリごとに個別のシークレットが発行できて、ドメインへのインストールも簡単、シークレットの再発行も可能です。実際に以前はこの方法を使っていたのですが、公開するつもりのないアプリがどんどん増えていきますし、しかもアプリの削除はできません。
ということで、最後の (4) が今回ご紹介する方法です。 Google Apps Extensions Console (以下、Apps Console)というツールを使ってシークレットが発行できます。アプリごとにプロジェクトを作成して個別にシークレットを発行できて、シークレットの再発行やプロジェクトの削除も自由に行えます。また、プロジェクトにチームメンバとして登録することで、複数のアカウントでシークレットを共有できます。他の方法に比べてとても使い勝手が良いので、 Google Apps 向けのアプリを開発している方は、覚えておくとたいへん便利だと思います。
Google Apps Extensions Console とは
Apps Console を使うと簡単に 2-legged OAuth 用のシークレット(正確にはコンシューマキーとコンシューマシークレットの組)を発行できるのは前述のとおりですが、そもそも Apps Console とはいったいなんなのかを説明してしまいましょう。
Apps Console が公開されたそもそもの目的は、 Gmail Contextual Gadget (こちらの記事参照)のカスタムエクストラクタ を登録することです。カスタムエクストラクタについての詳細は省きますが、簡単に言うとメールからガジェットに引き渡すデータの抽出方法規則を指定する機能です。
ただ、 Gmail Contextual Gadget は Marketplace アプリと密接に関連する仕組みであるため、 Apps Console には Marketplace アプリそのものを(Marketplace 自体には登録せずに)作成・管理する機能も実装されています。この機能を利用して Apps Console 上で Marketplace アプリを作成し、そのシークレットを使ってしまおう、というわけです。
Apps Console で Marketplace アプリを作成する
それでは、 Apps Console を使って Marketplace アプリを作ってみましょう。当然ながら、独自ドメインの Google Apps アカウントが必要です。無料、有料は問いません。アプリをドメインに登録する操作以外は、管理者でなくても大丈夫なはずです。
Apps Console でプロジェクトを作る
まずは Web ブラウザで Apps Console を開きます。 URL は以下のとおりです(<ドメイン名> の部分は Google Apps を使っているドメイン名に置き換えてください)。
http://code.google.com/googleapps/console/a/<ドメイン名>
すると、以下の画面になるはずです。
Google の API をよく使っている方は気づかれたかと思いますが、 Google APIs Console とそっくりですね。そう、 Apps Console は Google APIs Console の Google Apps 版とも言えるものです。
プロジェクトを作成するためには、「Create project...」と書かれた青いボタンをクリックします。プロジェクト名を尋ねてくるので、適当に入力してください。日本語でも OK みたいですw プロジェクトを作成すると、以下の画面になります。
これで、ひとまずプロジェクトが作成されました。シークレットはプロジェクトごとにひとつ発行されるので、アプリケーションごとに別のシークレットを使いたいなら、その分だけプロジェクトを作成します。上の画面で「プロジェクト」と書かれているドロップダウンから、プロジェクトの作成や切り替え、削除等が可能です。
Manifest を作成、登録する
Marketplace アプリを作成するためには、 Manifest と呼ばれる XML ファイルを作成しなければなりません。 Manifest についての詳細はこちらのページにありますが、単に OAuth のシークレットがほしいだけなら以下の記述で十分かと思います。
<?xml version="1.0" encoding="UTF-8" ?> <ApplicationManifest xmlns="http://schemas.google.com/ApplicationManifest/2009"> <!-- アプリケーション名と説明 --> <Name>テストアプリ</Name> <Description>テストアプリ</Description> <!-- OpenIDの設定 --> <Extension id="realm" type="openIdRealm"> <!-- 必ず自分の管理下のドメインを指定してください --> <Url>http://www.example.com</Url> <!-- ScopeタグのIDを列挙する --> <Scope ref="calendarFeed" /> </Extension> <!-- アクセスしたいAPIのスコープ定義 --> <Scope id="calendarFeed"> <Url>https://www.google.com/calendar/feeds/</Url> <Reason>適当な理由</Reason> </Scope> </ApplicationManifest>
まず、 Extension タグ内の Url タグに自分のドメインの URL を記述してください。この URL での OpenID ログインを許すことになるので、自分(もしくは自社)の管理下にある安全なドメインを指定してください。
そして、 ApplicationManifest タグの直下の Scope タグでアクセス権限を与える API のスコープを指定します(上記コードでは Calendar Data API へのアクセスを要求しています)。複数のスコープを指定する場合は、スコープの数だけ Scope タグを記述してください。指定可能なスコープはこちらで確認できます。
最後に、 Extension タグの中にも「<Scope ref="外のScopeタグのID" />」の形式ですべての Scope タグの ID を列挙すれば完成です。
完成した Manifest は、 Apps Console でアップロードします。先ほどの画面にある「Upload」ボタンをクリックするとダイアログが開くので、右上の「ファイルを選択」ボタンで先ほどの XML ファイルを選択してください。文法が正しければ、以下のように緑の背景で内容が表示されます。
右下の「Update Project」ボタンをクリックすれば、実際に Manifest がプロジェクトに登録されます。
アプリをドメインに登録する
管理者権限を持っていれば、 Manifest を登録すると Apps Console の画面が以下のようになるはずです。もし管理者でない場合は、「Team」タブで管理者権限を持つユーザーをプロジェクトに加えた上で、以下の操作を依頼してください。
Manifest を登録したことで 2-legged OAuth のためのシークレットが発行されたのですが、これを使用するためにはアプリをドメインに登録しなければなりません。もっとも、この操作はとても簡単で、「Deploy application...」ボタンをクリックして指示に従っていくだけです。
最終的に、 Google Apps 管理コンソールの以下ようなのページに遷移すれば、インストール完了です。
管理コンソールの Dashboard にも Marketplace アプリと同様にアプリが登録されており、そのリンクからいつでもこの画面を開くことができます。アプリのアンインストールもこの画面から可能です。
作成したシークレットを使う
これで準備ができたので、発行されたシークレットを使用して API にアクセスしてみましょう。クライアントとしては、ここでは実験ということで OAuth Playground を使います。プログラムからアプセスする方法については、例えばこちらのページには Tasks API にアクセスする Python と Java のサンプルコードが公開されていますので、参考にしてください。
シークレットを確認する
プロジェクトに割り当てられたコンシューマキーとコンシューマシークレットは、 Apps Console で確認できます。左のサイドバーから「Keys」を選択すると、以下のように表示されます。
万が一シークレットが外部に漏れてしまったときは、「Regenerate secret...」ボタンで再発行できます。
API にアクセスする
それでは、 Calendar Data API にアクセスしてみましょう。以下のリンクで OAuth Playground が開きます。
http://googlecodesamples.com/oauth_playground/
こんな画面が表示されるはずです。
そうしたら、おもむろに以下の操作をしてください。
- (2) の oauth_signature_method のドロップダウンで「HMAC-SHA1」を選択。
- oauth_consumer_key と consumer secret のテキストボックスに、 Apps Console に表示されていたものを入力。
- (6) のテキストボックスに以下の URL を入力。
https://www.google.com/calendar/feeds/default/allcalendars/full?xoauth_requestor_id=自分のメールアドレス - 「Execute」ボタンをクリック
アプリが正しく登録されていれば、成功のレスポンスが返るはずです。
Manifest でスコープを指定した API ならば、すべての機能が呼び出せるはずです。 POST や PUT を試したい時は、 (6) のドロップダウンでメソッドを選択し、その下の「enter post data」でリクエストボディを指定できます。いろいろ試してみてください。
以上、本日は Google Apps Extensions Console を使って 2-legged OAuth のシークレットを好きなだけ発行する方法をご紹介しました。アプリごとにシークレットを別にすれば、万が一再発行が必要になってもひとつのアプリだけに影響範囲を絞れます。また、スコープも別になるので、アプリに不要な権限を与える必要もありません。 2-legged OAuth によるアクセスがより手軽に使えるようになるので、ぜひ活用してください。
詳しくはこちらの記事をどうぞ!
この記事にコメントする