Recaptcha機能実装に当たってAPIキーを秘匿可能な状態にして呼び出す必要がありました。
が、某スクールカリキュラムでは最新のRailsバージョンを扱っておらず、環境変数を設定しようとして苦戦しました。ENVがどうしても読み込めない!!的なやつです^^;
あまり中身ないですが、メモ程度に残しておきます。
この記事はMacOSで且つターミナルを利用している場合のみに効力を発揮します。
credential.yaml.enc
秘匿する必要がある情報(API秘密鍵やパスワードなど)を外部漏洩させないための仕組みです。(master.keyでcredentials.yaml.encを暗号/復号化して使っている。と言う理解。そのため、master.keyは秘密鍵みたいなもの。こいつでは漏洩させてはダメな奴ですね!)
Rails5.2以降から実装されています。
それまでのバージョンで利用していたsecret.yamlは使えなくなっています。
内容を編集する
プロジェクト作成時点ではファイル自体が存在してません。
また、存在していたとしても暗号化されておりVSCなどから直接参照できません。
編集するためには、ターミナルでプロジェクトフォルダ直下に移動し、以下のコマンドを実行する必要があります。
EDITOR=vim bin/rails credentials:edit
このコマンドを打つことでcredentials.yaml.encとmaster.keyが生成されます。
もし、すでに存在していた場合はファイルを編集し保存することでcredentials.yaml.encが更新されます。
###補足
そもそも以下のようなエラーが出てeditorを開けない!と言う場合があります。
原因としてはcredentials.yaml.encを復号化するためのキーであるmaster.keyの値が間違っている可能性が高いです。
個人でやってるのに上手く行かない…と言う場合は、master.keyとcredential.yaml.encを一旦消して、再作成すると上手く行ったりしました。
ActiveSupport::MessageEncryptor::InvalidMessage
編集例
作成直後は以下のような状態になっています。
#aws:
# access_key_id: *******************
# secret_access_key: ************************
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: **************************
例えば、今回試したReCAPTCHAのapiを足したい場合、こんな感じで追加すればOKです。
#省略#
secret_key_base: **************************
recaptcha:
RECAPTCHA_SITE_KEY: 'APIキー('は入力不要です)'
RECAPTCHA_SECRET_KEY: 'APIキー('は入力不要です)'
基本は「キー名: キー値」のセットを書いておけば良いと思ってます。
記載においてハマった点などを以下にまとめました。
【記載における注意点】
①見通しを良くする為にgem名やサービス名でタイトルをつけてあげると良いと思います。
→ 上の例で言う'recaptcha:'の部分です。
②タイトルを記載した場合、下の段に書くキーの始まりは半角スペースを2又は3つ入れてください。
(スペース数はファイル内で統一しておくのが望ましいらしいです。メンターさん指摘)
→ スペースが無い、又はタブでインデントを入れた場合はエラーとなります。
③'キー名:'の後は必ず半角スペースが1つ必要です。
→ こちらも入れないとエラーになります。
④大文字/小文字も厳密に見られているようです。
※この辺りは、おそらくyamlの書き方作法なのかな?詳しくは検索してみてください。
成功すれば「New credentials encrypted and saved.」とターミナルに表示されます。
保存時に下記のようならエラーが出た場合、ほぼ間違いなく記載ミスです。見直しましょう。
`parse': (<unknown>): mapping values are not allowed in this context at line 10 column 23 (Psych::SyntaxError)
動作確認について
このキーの記載。ものすごーく間違いやすいです。
タイプミスなどしていてもcredentials.yaml.encの保存自体はできてしまいます。
ですが、Railsの起動時にconfigのinitializerなどで該当のキー値を参照していた場合、サーバーが起動できなくなるなど、エラーを引き起こします。
その為、設定しようとしたキーが本当に参照できるのかは、事前にチェックしておくことをお勧めします。
チェックはコンソールから簡単にできます。
$ rails c
[1] pry(main)> Rails.application.credentials.recaptcha[:RECAPTCHA_SITE_KEY]
# OKパターン
=> "キーの値が表示される"
# NGパターン
=> nil
もし、nilが返ってきてしまった場合、コンソールに留まったまま、更に以下のようなコマンドを叩きましょう。そうするとcredentials.yaml.encの中身を参照することができます。
今回の例で見ると':RECAPTCHA_SITE_KE’となっており、誤字があるのが分かります。
[2] pry(main)> Rails.application.credentials
=> @config=
{:recaptcha=>{:RECAPTCHA_SITE_KE=>"キー値", :RECAPTCHA_SECRET_KEY=>"キー値"},
@content_path= '・・・以下略・・・'
もし、そもそも「Rails.application.credentials」が見れないようなら、何かしらyamlの文法に則っていない書き方をしている可能性があります。今一度確認をしてみてください。
キーの呼び出し方
credentials.yaml.encに書いたキーは以下のように記載することで呼び出しが可能です。
以下にReCAPTCHAの例を記載します。
Recaptcha.configure do |config|
config.site_key = Rails.application.credentials.recaptcha[:RECAPTCHA_SITE_KEY]
config.secret_key = Rails.application.credentials.recaptcha[:RECAPTCHA_SECRET_KEY]
end
デフォルトで'Rails.application.credentials'は必ず書きます。
そこにタイトルをつけた人は、.'タイトル名’を書き、続けて[:キー名]を記載してください。
#GitHubについて
GitHubを利用している場合の共有方法ですが、credentials.yaml.encは基本的にGitHubに共有してしまって良いようです。暗号化されてるし。
ただし、それらの復号化キーであるmaster.keyは必ず'.gitignore'に記述し、GitHubの管理対象から外す必要があります。とは言え、master.keyができた段階で自動的に対象外指定が入るようですので、特に気にすることはありません。間違って消すことの無いようにだけ、注意しましょう。
#まとめ
分かってしまえば簡単!
ただ、GitHubを使ったチーム開発時のmaster.key管理には注意です!
間違っているところなどがあれば、ご指摘いただけると嬉しいです。