(メモ) Google APIを呼び出すためのOAuth 2.0認可処理

まだちゃんと動くところまで行っていませんが、現時点までの作業メモ。

目的は、Google Calendar APIを用いたWebアプリ (スケジュール入力支援) をRuby on Railsで作ることです。
Google APIにはRuby用のクライアントライブラリも提供されていることもあり、API呼び出し自体はそれほど難しそうではないものの、アクセス権の取得のためにOAuth 2.0への対応が必要になり、むしろこちらの方が手間がかかりそうです。

使用ソフトウェアとバージョン

環境構築 (Google API)

まずGoogle APIを使うための下準備をします。必要な作業は以下の2つ。

  • Google API Consoleでのプロジェクト作成
  • Google APIクライアントライブラリのインストール

いずれもGoogle Calendar APIのホームページからたどれるドキュメントを参照して問題なく完了しました。
なお、Google APIRubyクライアントライブラリは現在alpha版とのことで、まだ実運用環境で使える段階ではないようです。

OAuth 2.0認可処理 (スタンドアロン版)

Railsとの組み合わせの前に、Ruby版Google APIクライアントライブラリ に載っているサンプルを元に、スタンドアロン (というかirb) でOAuth2の挙動を確認します。

途中のステップで、Googleのサイトでの承認操作を行ったあと、そこで発行されるauthorization codeが必要になる都合上、ここではirbを用います。途中で登場する , には、Google APIコンソールから取得した文字列が入ります。

$ irb
irb(main):001:0> require 'google/api_client'
=> true
irb(main):002:0> client = Google::APIClient.new
=> #<Google::APIClient:0x0000000182fbd0 ... >
irb(main):003:0> client.authorization.client_id = <Client ID>
=> <Client ID>
irb(main):004:0> client.authorization.client_secret = <Client Secret>
=> <Client Secret>
irb(main):005:0> client.authorization.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
=> "urn:ietf:wg:oauth:2.0:oob"
irb(main):006:0> client.authorization.scope = 'https://www.googleapis.com/auth/plus.me'
=> "https://www.googleapis.com/auth/plus.me"
irb(main):007:0> redirect_uri = client.authorization.authorization_uri
=> #<Addressable::URI:0xc06fc0 URI:https://accounts.google.com/o/oauth2/auth?... >

上記引用部分最後に出てくる URI:... の部分がGoogleに対する承認操作を行うためのURLです。ブラウザからこのURLにアクセスすると、以下のように許可を求められます。ここで「アクセスを許可」を選択すると、Googleにログインしたアカウントの権限で、「Googleでのユーザの把握」という許可をアプリケーション (ここではirb上で動かしているもの) に与えることになります。

ここで「アクセスを許可」を選択した結果、以下のようなコードが出力されます。

以下、irbに戻って、先ほど出力されたコードを張り付けることでOAuth 2.0を用いた認可処理が完了になります。

irb(main):008:0> client.authorization.code = '4/g8B6U7tySrGFXRFvpamZ_KkcEOW2.QiOkz9dGebYXgrKXntQAax0O2E6GdwI'
=> "4/g8B6U7tySrGFXRFvpamZ_KkcEOW2.QiOkz9dGebYXgrKXntQAax0O2E6GdwI"
irb(main):009:0> client.authorization.fetch_access_token!
=> {"access_token"=>"ya29.AHES6ZQ (略)", "token_type"=>"Bearer", "expires_in"=>3600, "id_token"=>"eyJhbGc (略)", "refresh_token"=>"1/vYol_NH (略)"}
irb(main):010:0> result = client.execute(:api_method => client.discovered_api('plus').activities.list, :parameters => {'collection' => 'public', 'userId' => 'me'})
=> #<Google::APIClient::Result:0x00000001adadd0 @request=...>

ここまで一応成功しているようです。