📌
googleauth gemで直接JSONを読み込んで認証する
『googleauth gem』のREADMEを読むと、以下のようにFirebaseコンソールからダウンロードしたJSONファイルのパスを読み込んで認証をしている。
scope = 'https://www.googleapis.com/auth/androidpublisher'
authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: File.open('/path/to/service_account_json_key.json'),
scope: scope)
authorizer.fetch_access_token!
ただ、JSONファイルのパスを読み込むのではなく、JSONの中身を引数に直接渡して認証をしたかったので、その方法をメモとして残しておく。
StringIOクラスを使って認証をする
結論から書くと、StringIOクラスを使って以下のように記述すると、JSONファイルの中身を引数に直接渡して認証することできる。
まずは、FirebaseコンソールからダウンロードしたJSONファイルの中身をenvファイルに記述する。
# .env
JSON_KEY={"type": "service_account","project_id": "xxxxxxxx","private_key_id": "xxxxxxxxx","private_key": "xxxxx・・・以下省略}
次にmake_credsメソッドの引数json_key_ioに『StringIO.new(ENV.fetch[‘JSON_KEY’])』を渡す。
# xxxx.rb
scope = 'https://www.googleapis.com/auth/firebase.messaging'
authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: StringIO.new(ENV.fetch['JSON_KEY']),
scope: scope)
authorizer.fetch_access_token!
これでJSONファイルの中身を引数に直接渡して認証できるはず。
StringIOについては、こちらを読むと理解が深まると思う。
つまづいたポイント
.envファイルにJSON_KEYを記述すると、以下のようなエラーが出た。
Neither PUB key nor PRIV key: no start line (OpenSSL::PKey::RSAError)
どうやらJSON_KEY内のprivate_keyがちゃんと読み込みていないっぽい。
FirebaseコンソールからダウンロードしたJSONファイルに書かれているprivate_keyの値をよく見ると、”\nxxxxxxxx\nxxxxxxxxx”のようにところどころ改行されている。
どうやら.envファイル内の『\n』はエスケープされてしまうみたいなので、このエスケープを打ち消すために『\n』を『\n』に置き換えてやる必要がある。
private_key内の『\n』を全部『\n』に置き換えたら、無事に認証が通った。
めでたしめでたし。
Discussion