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

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.1 リファレンスマニュアル)
文字列に ] と同じインタフェースを持たせるためのクラスです。

 

つまづいたポイント

 

.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をコピーしました