credential.ymlとmaster_keyについて 簡単なメモ

はじめに

チーム開発においてpayjp導入を担当する事になりました。 導入にあたり、早々にエラーが発生したのですが、そのおかげ(?)で表題について勉強する事が出来ました。

環境 rails (~> 5.2.3)

この記事で言いたいこと(最後の"まとめ"にも記載)

payjp(をはじめとするAPI)を利用するにあたり、APIキーをcredential.ymlという”宝箱”にしまうというやり方がある。(※他に、環境変数から参照する方法もある)

宝箱にしまわれたAPIキーを、宝箱を開けた上で見る(復号化)には、1アプリに1つしかないmaster_keyが必要。(暗号化された文章を、読める形に戻すことを復号化と言う)

エラー発生までの間に実行した内容

クレジットカード決済機能を実装したく、gemfileにgem 'payjp'を追記のうえ、bundle install実行。

payjpのシークレットキーをcredentials.yml.encに追加するため、ターミナルでEDITOR="vi" bin/rails credentials:editを実行。

ターミナル上に表示された内容

Adding config/master.key to store the master encryption key: 26fe97030a3ebb1817f57ba3fff16e2a Save this in a password manager your team can access. If you lose the key, no one, including you, can access anything encrypted with it. create config/master.key

そのしばらく後の文章に

ActiveSupport::MessageEncryptor::InvalidMessageエラーが表示されました。

エラーの内容

たくさんググって調べたのですが、自己解決に至らずメンターさんに相談させて頂きました。

今回の場合は、『今持っている鍵では宝箱が開かないよ!』というエラーである事がわかりました。

私たちのチームでは、私以外のAさんがrails newを実行しアプリを作成しました。

つまりAさんが今回のアプリのmaster_keyの値を把握しているということになります。

(rails newの際にcredential.ymlとmaster_keyが生成されます)

我々はアプリ立ち上げ当初から今までmaster_keyの情報共有をしていませんでした。

本来であれば、master_keyの情報共有をし、(rails newを実行したAさん以外の)メンバーが、各自のconfig/master.keyのファイルの内容を、master_keyの値に上書きしていれば起きていなかったエラーでした。

まとめ

・payjp(をはじめとするAPI)を利用するにはAPIキーを、credential.ymlという”宝箱”にしまうというやり方がある。(※他に、環境変数から参照する方法もある)

・宝箱にしまわれたAPIキーを、宝箱を開けた上で見る(復号化)には、1アプリに1つしかないmaster_keyが必要。(暗号化された文章を、読める形に戻すことを復号化と言う)

・master_keyはrails newした人しか知らないため、チームメンバー間で共有する必要がある。

rails newした人以外のメンバーは各自、エディタ(私たちはVS CODEを使用)上で、master.keyファイルに記載されている値を、共有したmaste_keyの値に書き換える。(メンバー全員がやらないと、API使用にあたり支障が生じる。同じ宝箱の中身(今回はpayjpのAPIキー)を共有したいのであれば鍵を共有する必要がある)

感想

初見のエラーにぶち当たった瞬間は割と絶望的な気分になるものの、

自分でいろいろ調べたり、メンターさんに対して工夫しながら質問した上で頂いた回答を『○○という理解でよろしいですか?』とまとめる作業を経て、エラー解決に至る、というプチ成功体験をすると、大きなインパクトが自分の中で残り知識定着に繋がると感じました。

以上です。

初学者のメモ用記事です。何か誤っている内容等あればご指摘いただければ幸いです。 ご覧いただきありがとうございました!