(メモ) Google APIを呼び出すためのOAuth 2.0認可処理
まだちゃんと動くところまで行っていませんが、現時点までの作業メモ。
目的は、Google Calendar APIを用いたWebアプリ (スケジュール入力支援) をRuby on Railsで作ることです。
Google APIにはRuby用のクライアントライブラリも提供されていることもあり、API呼び出し自体はそれほど難しそうではないものの、アクセス権の取得のためにOAuth 2.0への対応が必要になり、むしろこちらの方が手間がかかりそうです。
使用ソフトウェアとバージョン
- Ruby 1.9.3-p327
- Ruby on Rails 3.2.9
環境構築 (Google API)
まずGoogle APIを使うための下準備をします。必要な作業は以下の2つ。
いずれもGoogle Calendar APIのホームページからたどれるドキュメントを参照して問題なく完了しました。
なお、Google APIのRubyクライアントライブラリは現在alpha版とのことで、まだ実運用環境で使える段階ではないようです。
OAuth 2.0認可処理 (スタンドアロン版)
Railsとの組み合わせの前に、Ruby版Google APIクライアントライブラリ に載っているサンプルを元に、スタンドアロン (というかirb) でOAuth2の挙動を確認します。
途中のステップで、Googleのサイトでの承認操作を行ったあと、そこで発行されるauthorization codeが必要になる都合上、ここではirbを用います。途中で登場する
$ 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=...>
ここまで一応成功しているようです。