2015-06 << 2015-07 >> 2015-08

2015-07-28 (火)

* ClientLogin から OAuth2.0 に

3年以上前に作って放置してたsimple-googlespreadsheet-rubyが動かなくなっていたのを修正.

GoogleのClientLoginのサポートが終了してしまってもしばらく動いてたのだけど,先月から本当に使えなくなっていたので,いまさらながらOAuth2に対応する.

OAuth2認証には https://github.com/google/signet を使う.Service Accountを使いたいのでDeveloper Consoleからダウンロードした秘密鍵で認証.

require 'json'
require 'openssl'
require 'signet/oauth_2/client'

secret = JSON.parse(File.read('binzume-2f903d30a6df.json'))
auth = Signet::OAuth2::Client.new(
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
  :audience =>             'https://accounts.google.com/o/oauth2/token',
  :scope =>                ['https://spreadsheets.google.com/feeds'],
  :issuer =>               secret["client_email"],
  :signing_key =>          OpenSSL::PKey::RSA.new(secret["private_key"]))

auth.fetch_access_token!
puts auth.access_token

最初正しいscope渡してるのにscopeを要求するエラーが出るので嵌ったけど,signing_keyに秘密鍵のpemの文字列をそのまま渡していたのが原因だった.OpenSSL::PKeyを渡したらうまくいった.

API呼ぶときは,いままで "Authorization: GoogleLogin auth=*AUTH_TOKEN*" にしていたのを "Authorization: Bearer *ACCESS_TOKEN*" にするだけ.

サービスアカウントは別アカウント扱いなのでメールアドレスをスプレッドシートの共有先に追加する必要がある.

そもそも3年以上前に作って放置してたライブラリだし,google-drive-rubyを使うべきなので,時間あったら移行してしまおう.

これのせいで,口座残高や履歴のGoogleスプレッドシートへの同期が止まっていたのも直った.スプレッドシートへの同期だけだと思って放置してたけど,スプレッドシートの値を見て動作する処理が動いてたの思い出したので慌てて.

2015-06 << 2015-07 >> 2015-08