Windows7でRubyを使ってコマンドラインからGoogleAPIを叩くために、OAuth認証で使用するClientIDやClientSecret・トークンが記載されているYAMLファイルを取得しようとしたところ、いろいろとハマったためメモを残します。
環境
- Windows7 SP1
- ruby 2.0.0p353 (2013-11-22) [i386-mingw32]
- google-api-client 0.6.4
- Google Calendar API を使用
Google Cloud Console での設定
GoogleAPIを使用するための設定画面は、今までのGoogle API Consoleから、Google Cloud Consoleへと変更になっているため、以下のURLより行います。
https://cloud.google.com/console#/project
流れは以下の通りです。
- 「CREATE PROJECT」を押します。
- 「Project name」と「Project ID」に任意の名前を入れます。
- 「Creating Project」が表示されるので、しばらく待ちます。
- Projectの作成が終わると、作成したProjectのOverview画面へ移動します。
- 左のメニューの「APIs & auth」を選択します。
- 以下の4つが「ON」になっていますが、使う予定がないことから、念のため「OFF」にしておきます。
- Calendar APIを「ON」にします。
- 左のメニューの「Registered app」を選択します。
- 「REGISTER APP」を選択します(なお、すでに「Service Account-project」が登録されています)。
- 以下の値を設定し、Registerを選択します。なお、今回はコマンドラインから使用するため、Platformは「Native」になることに注意します。
- Name: 任意の名前
- Platform: Native
- 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ファイルを追加します。
- エラー:OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed - komiyakの通り道
- ruby on rails - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed - Stack Overflow
- Download a cacert.pem for RailsInstaller · GitHub
上記の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