Googleのパスワード認証が終了したみたいで、GoogleのAPIを使った自作ツールが軒並み動かなくなりました。独自形式でGoogle Analyticsのアクセス解析結果をまとめてExcelで出力とかやってたもんだから、顔面蒼白です。どげんかせんといかん。
Googleの認証がOAuthのみになった
OAuthのみになったようなのだけれど、固定ユーザーで認証して使いたいツールだったので、プログラム側のみで認証が終わってほしいのです。
なお、有効にするAPIは選択式なので、Google Developers Consoleから設定していきます。
まだプロジェクトがない場合は、適当なプロジェクトを作りましょう。
3つの認証方法
- ウェブ アプリケーション
- サービス アカウント
- インストールされているアプリケーション
サービス アカウントが使えるかな?と思ったのですが、どうもこれはGoogle Appsユーザーのみ利用可能なようで、残りは2つですが、ウェブアプリケーションだとユーザーが認証しないといけないので今回はインストールされているアプリケーションを選択するのがよさそう。
使ったライブラリ
使ったライブラリは以下の2つ。
google-oauth2-installed
google-oauth2-installedはインストールされているアプリケーション向けに特化したOAuth2用のgemです。環境変数にclient_idやclient_secretなどを設定して、rake taskを呼び出したらURLが表示されるのでそこにアクセスして認証を終えるとアクセストークンとかがもらえるのでそれをまた環境変数に保存しておくのです。
その際に使えるのが、dotenv(dotenv-rails)です。
dotenv(dotenv-rails)
dotenvは、.envファイルに環境変数を書いておけるgemです。
開発環境では、.envファイルの内容を参照し、本番環境では、ファイルに保存せずに環境変数を設定しておきます。そうすることで、ソースコードに認証情報を残さなくて済みます。
.gitignoreに.envを加えることを忘れないように!!
認証してみる
goole-oauth2-installedのREADMEに方法は書いてあるので、なぞるだけになりますが…。
インストール
Gemfileに追加
gem 'google-oauth2-installed'
gem 'dotenv-rails', group: [:development, :test]
インストール
bundle install
.envファイルを作成
.envファイルを作って、Google Developers Consoleで作った認証情報を設定しておきます。OAUTH2_SCOPEは、Google APIのスコープなので、それぞれのAPIのものを入れましょう。今回は、Google AnalyticsのAPIを使ったので、https://www.googleapis.com/auth/analytics.readonly
になります。
OAUTH2_CLIENT_ID="..."
OAUTH2_CLIENT_SECRET="..."
OAUTH2_SCOPE="https://www.googleapis.com/auth/analytics.readonly"
アクセストークンの取得
ここまで設定できたら、アクセストークンを取得するためのrake taskを呼びます。
bin/rake googleoauth2installed:get_access_token
なお、springのバージョンがものすごく古いとエラーが出たので、bundle update spring
しておくとよいかもしれません。
これを実行すると、アクセスするべきURLが表示されるので、そのURLにアクセスして認証を済ませて、表示された文字列をコンソールに入力します。
すると、さらに環境変数に登録するべきものが出力されます。
OAUTH2_ACCESS_TOKEN="..."
OAUTH2_REFRESH_TOKEN="..."
OAUTH2_EXPIRES_AT="..."
これらを.envに追加します。
これで、OAuth認証は完了しました。
利用方法
あとは、OAuth認証のアクセストークンを必要としているライブラリや処理に対して、アクセストークンを渡してやるだけです。
私の場合は、Garbに渡しました。
Garb::Session.access_token = GoogleOauth2Installed.access_token
あとは今までと同じように使うだけです。
まとめ
認証をプログラム側だけにおさめるのであれば、この方法が便利そうです。
あとは本番環境ではちゃんと環境変数に必要な情報を設定しましょう。