Windows7 + Ruby + google-api-clientで、GoogleAPI向けOAuth認証用のYAMLファイルを取得する

Windows7Rubyを使ってコマンドラインからGoogleAPIを叩くために、OAuth認証で使用するClientIDやClientSecret・トークンが記載されているYAMLファイルを取得しようとしたところ、いろいろとハマったためメモを残します。

環境


 

Google Cloud Console での設定

GoogleAPIを使用するための設定画面は、今までのGoogle API Consoleから、Google Cloud Consoleへと変更になっているため、以下のURLより行います。
https://cloud.google.com/console#/project


流れは以下の通りです。

  1. 「CREATE PROJECT」を押します。
  2. 「Project name」と「Project ID」に任意の名前を入れます。
  3. 「Creating Project」が表示されるので、しばらく待ちます。
  4. Projectの作成が終わると、作成したProjectのOverview画面へ移動します。
  5. 左のメニューの「APIs & auth」を選択します。
  6. 以下の4つが「ON」になっていますが、使う予定がないことから、念のため「OFF」にしておきます。
  7. Calendar APIを「ON」にします。
  8. 左のメニューの「Registered app」を選択します。
  9. 「REGISTER APP」を選択します(なお、すでに「Service Account-project」が登録されています)。
  10. 以下の値を設定し、Registerを選択します。なお、今回はコマンドラインから使用するため、Platformは「Native」になることに注意します。
    • Name: 任意の名前
    • Platform: Native
  11. OAuth 2.0 Cilent ID の画面が表示されるため、「CLIENT ID」「CLIENT SECRET」をメモします。

google-api-clientの準備と利用

今回は、「d:\hoge」の中で作業をすることにします。

C:\>cd /d d:\
d:\>mkdir hoge
d:\>cd hoge


環境を汚さないよう、Bundlerで必要なライブラリを入れるため、Gemfileを作っておきます。
Gemfile

source "https://rubygems.org"
gem "google-api-client"


path指定して、bundle install します。

d:\hoge>bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Installing addressable (2.3.5)
Installing extlib (0.9.16)
Installing multi_json (1.8.2)
Installing autoparse (0.3.3)
Installing multipart-post (1.2.0)
Installing faraday (0.8.8)
Installing jwt (0.1.8)
Installing launchy (2.4.2)
Installing signet (0.4.5)
Installing uuidtools (2.1.4)
Installing google-api-client (0.6.4)
Using bundler (1.3.5)
Your bundle is complete!
It was installed into ./vendor/bundle

Windowsでもhogeの下にvendor/bundleフォルダができています。
参考: Rails開発環境の構築(rbenvでRuby導入からBundler、Rails導入まで)(Macport編) - Qiita




次に、認証用のYAMLを取得しますが、そのままだとコケるため、以下を参考にpemファイルを追加します。


上記の3番目のgistよりリンクされている以下のコード(win_fetch_cacerts.rb)をコピーして、今回の作業場所(d:\hoge)の下に置きます。
https://gist.github.com/fnichol/867550/raw/win_fetch_cacerts.rb


ただ、そのままのファイル(win_fetch_cacerts.rb)ではRailsInstallerを使っている前提のため、そのままでは動作しません。
そのため、File.joinの引数を修正して、d:\hoge直下にpemファイルを置くように修正します。(必要に応じて、コメントも修正)

#cacert_file = File.join(%w{c: RailsInstaller cacert.pem})
cacert_file = File.join(%w{d: hoge cacert.pem})


修正が終わったら、「win_fetch_cacerts.rb」を実行します。

d:\hoge>D:\hoge\win_fetch_cacerts.rb

# 結果
A bundle of certificate authorities has been installed to
d:\hoge\cacert.pem
 * Please set SSL_CERT_FILE in your current command prompt session with:
      set SSL_CERT_FILE=d:\hoge\cacert.pem
 * To make this a permanent setting, add it to Environment Variables
   under Control Panel -> Advanced -> Environment Variables


完了後、pemファイルがhoge直下に作成されます。
あとは、忘れずに環境変数も追加します。一度取得してしまえば終わりなので、コマンドプロンプトでの設定で問題ないかと思います。

d:\hoge>set SSL_CERT_FILE=d:\hoge\cacert.pem


最後に、google-api-client を実行します。「CLIENT ID」と「CLIENT SECRET」はそれぞれ読み替えます。

d:\hoge>bundle exec google-api oauth-2-login --scope=https://www.googleapis.com/auth/calendar --client-id= --client-secret=


ブラウザの新規タブが起動し、以下のような表示がされますので、「承認する」を選択します。

Project Default Service Account

このアプリが次の許可をリクエストしています:
カレンダーの管理


その後、ブラウザのタブが閉じますので、%USERPROFILE%の下にYAMLファイルができています。

%USERPROFILE%\.google-api.yaml


「.google-api.yaml」ファイルの内容は以下のような感じです。

---
mechanism: oauth_2
scope: https://www.googleapis.com/auth/calendar
client_id: <ID>
client_secret: <SECRET>
access_token: <ACCESS_TOKEN>
refresh_token: <REFRESH_TOKEN>


 

エラーとなった行為

Cloud ConsoleでService Account-projectのCLIENT IDとCLIENT SECRETを使ってしまう

Service Account-projectの「CLIENT ID」と「CLIENT SECRET」を利用してYAMLファイルを作成しようとすると、「bundle exec google-api oauth-2-login」を実行後にブラウザは起動するものの、エラー画面となります。

エラーredirect_uri_mismatch

The redirect URI in the request: http://localhost:12736/ did not match a registered redirect URI


以下を読んで、Platformが「Native」のものを追加する必要があることに気づきました。
Google OAuth2 Authorizing OAuth token error: redirect_uri_mismatch - Stack Overflow


 

pemファイルをダウンロードしないまま、google-api-client を実行してしまう

「bundle exec google-api oauth-2-login」を実行後にブラウザは起動するものの、認証ボタンを押した後に以下のエラーが表示されます。

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed


 

「CLIENT ID」と「CLIENT SECRET」を取得したGoogleアカウント以外のGoogleアカウントを使って、ブラウザによる承認を行ってしまう (2013/12/19 追記)

YAMLファイルはできますが、ブラウザのGoogleアカウント用の承認内容になっています。そのため、「CLIENT ID」を取得したGoogleアカウントに紐づくGoogleカレンダーからデータを取得しようとすると「403 Forbidden」などのエラーが返ってきます。
最初そのことが分からず、プログラム実行中に想定していたGoogleアカウントのカレンダーIDを持ってきていないことに気づきました。