📌

googleauth gemで直接JSONを読み込んで認証する

2024/07/22に公開

『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については、こちらを読むと理解が深まると思う。
https://docs.ruby-lang.org/ja/latest/class/StringIO.html

つまづいたポイント

.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