googleauth gemで直接JSONを読み込んで認証する | Tomoyuki Kato's Blog

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

Engineering
この記事を書いた人

PharmaXというオンライン薬局のスタートアップで薬剤師・エンジニアとして働いています。Rails・React・TypeScriptなどを書きます。英語が得意でTOEIC900点・通訳案内士資格取得。主に薬剤師の働き方やプログラミング、英語学習について書きます。当サイトではアフィリエイトプログラムを利用して商品を紹介しています。
>> 詳しいプロフィール

Tomoyuki Katoをフォローする

 

『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については、こちらを読むと理解が深まる。

class StringIO (Ruby 3.3 リファレンスマニュアル)
文字列に ] と同じインタフェースを持たせるためのクラスです。

 

つまづいたポイント

 

.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』に置き換えたら、無事に認証が通った。

めでたしめでたし。

タイトルとURLをコピーしました