【Rails】credentials.yaml.encについての一口メモ

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
```

# 編集例
作成直後は以下のような状態になっています。

```ターミナル.vim
#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です。

```ターミナル.vim
#省略#
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などで該当のキー値を参照していた場合、サーバーが起動できなくなるなど、エラーを引き起こします。

その為、設定しようとしたキーが本当に参照できるのかは、事前にチェックしておくことをお勧めします。
チェックはコンソールから簡単にできます。

```ターミナル.rb
$ rails c

[1] pry(main)>  Rails.application.credentials.recaptcha[:RECAPTCHA_SITE_KEY]

# OKパターン
 => "キーの値が表示される"

# NGパターン
 => nil

```

もし、nilが返ってきてしまった場合、コンソールに留まったまま、更に以下のようなコマンドを叩きましょう。そうするとcredentials.yaml.encの中身を参照することができます。
今回の例で見ると':RECAPTCHA_SITE_KE’となっており、誤字があるのが分かります。

```ターミナル.rb
[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.rb

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管理には注意です！

間違っているところなどがあれば、ご指摘いただけると嬉しいです。