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スプレッドシートへの同期が止まっていたのも直った.スプレッドシートへの同期だけだと思って放置してたけど,スプレッドシートの値を見て動作する処理が動いてたの思い出したので慌てて.