Ruby on RailsとFirebaseを連携させる際にdotenvを用いて秘密鍵の情報を隠す方法

## 環境
* Rails 7.0.3
* Ruby 3.0.1

## 参考元

今回の記事を作成するにあったって以下のサイトを参考にしました。
[主にこちらを参考にしました。](https://zenn.dev/mochiblock/articles/96b6762011b6f9)
[ファイルを使わない方法(Google Cloudのドキュメント)](https://googleapis-dev.translate.goog/ruby/google-cloud-firestore/latest/Google/Cloud/Firestore.html?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=wapp#new-class_method)
[dotenv内に改行コードを挿入する方法](https://tech.quartetcom.co.jp/2018/09/06/symfony-dotenv-values-including-newlines/)（秘密鍵に改行コードが含まれているので）

## 本題
__「〇〇の部分まで参考記事を見てください」と書かれたら不便だと思うので以下の部分は参考にしたサイトの内容を書き写しています。__

### 事前準備
> [公式のドキュメント](https://firebase.google.com/docs/firestore/quickstart?hl=ja#create)に従ってCloud FireStoreデータベースの作成と秘密鍵の取得をします。

<details>
<summary>データベースの作成と秘密鍵取得の方法（一応）</summary>
1.データベース作成

[こちら](https://console.firebase.google.com/)にアクセスします。

以下のような画面が出てくるはずなので、「プロジェクトを追加」の部分をクリックします。![無題2_20220811173206.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228166/317bb654-7cce-2606-c75f-5064282ff130.png)

以下のような画面が出てくるはずなので、適当なプロダクト名をつけます。

![スクリーンショット 2022-08-11 17.25.45（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228166/f8545f89-9852-e9c7-202e-e2c4a85d465c.png)
以下のような画面が出てくるはずなので、「続行」の部分をクリックします。
![スクリーンショット 2022-08-11 17.25.54（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228166/e6a6940d-d6bd-54c0-5364-6279db0b0c69.png)
以下のような画面が出てくるはずなので、適当にアカウントを選択します。
![スクリーンショット 2022-08-11 17.35.52（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228166/68d49971-6830-8796-adeb-784097909457.png)
プロダクトが完成したら、以下のような画面が表示されるので、「Cloud Firestore」の部分をクリックし、指示に従ってCloud Firestoreを作成します。
![スクリーンショット 2022-08-11 18.22.43（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228166/6d1fae39-9084-9d9b-223e-29ea0075cf6d.png)


2.秘密鍵の取得
左上の歯車のマークをクリックし、「ユーザーと権限」をクリックします。
![スクリーンショット 2022-08-11 18.32.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228166/fcb9767d-fb29-a693-cab5-330aeb46d053.png)
「サービス　アカウント」をクリックし、「新しい秘密鍵の生成」ボタンをクリックし、その後表示される「キーを生成」をクリックするとキーがダウンロードされます。
![スクリーンショット 2022-08-11 18.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2228166/f72a5579-c161-d578-576e-081c943a4529.png)






</details>

### 手順
> 1. Gemfileに「gem "google-cloud-firestore"」と「gem 'dotenv-rails'」 を追加
> 2. bundle install (またはbundle update)
> 3. 認証設定

### 認証設定

まず、認証に必要な秘密鍵の情報を.env内に記述します。
ダウンロードした（であろう）秘密鍵のjsonファイルに以下のような形式で認証に必要な情報が入っていると思います。
~~~hoge.json
{
    "type": "○○○○○○○○○○",
    "project_id": "○○○○○○○○○○",
    "private_key_id": "○○○○○○○○○○",
    "private_key": "-----BEGIN PRIVATE KEY-----なんか長いの\n-----END PRIVATE KEY-----\n",
    "client_email": "○○○○○○○○○○@○○○○○○○○○○.iam.gserviceaccount.com",
    "client_id": "○○○○○○○○○○",
    "auth_uri": "https://accounts.google.com/○○○○○○○○○○",
    "token_uri": "https://○○○○○○○○○○.googleapis.com/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/○○○○○○○○○○",
    "client_x509_cert_url": "https://www.googleapis.com/○○○○○○○○○○.iam.gserviceaccount.com"
}
~~~
この中身の改行を（改行コードではありません）消して1行にし、シングルクォーテーション「'」で（←ここ重要　ダブルクォーテーション「"」ではダメです。）囲んだものを.envに値として追加します。[参考元](https://tech.quartetcom.co.jp/2018/09/06/symfony-dotenv-values-including-newlines/)
[補足：dotenvの使い方](https://qiita.com/__Wata16__/items/d2d3aa21623f8c026d5d)
~~~.env
GOOGLE_CLOUD_CREDENTIALS_JSON = '{"type": "○○○○○○○○○○","project_id": "○○○○○○○○○○","private_key_id": "○○○○○○○○○○","private_key": "-----BEGIN PRIVATE KEY-----なんか長いの(この中の改行コードは消さないでください。)\n-----END PRIVATE KEY-----\n","client_email": "○○○○○○○○○○@○○○○○○○○○○.iam.gserviceaccount.com","client_id": "○○○○○○○○○○","auth_uri": "https://accounts.google.com/○○○○○○○○○○","token_uri": "https://○○○○○○○○○○.googleapis.com/token","auth_provider_x509_cert_url": "https://www.googleapis.com/○○○○○○○○○○","client_x509_cert_url": "https://www.googleapis.com/○○○○○○○○○○.iam.gserviceaccount.com"}'
~~~
次に、dotenv内に書いた秘密鍵の情報をコントローラー内で呼び出します。
~~~ hoge_controller.rb
require 'google/cloud/firestore'
class Hoge < ApplicationRecord
  def hoge
    credentials_hash = JSON.parse(ENV['GOOGLE_CLOUD_CREDENTIALS_JSON']) # 秘密鍵の情報をdotenvから取得し、Hashに変換
    firestore = Google::Cloud::Firestore.new(project_id: credentials_hash["project_id"], credentials: credentials_hash)  # firestreインスタンスを作成
    doc_ref = firestore.doc("hoge/fuga") # 読み込み・保存先のパスを指定
    # ここにFirebaseの読み書きをさせるコードを書く場所
  end
end
~~~

この後にfirebaseのデータを読み書きするコードを加えたらRuby on Railsとfirebaseの連携ができます。
※1行目のrequire 'google/cloud/firestore'を忘れないようにしてください。

### おまけ(データベースの読み書き方法)
* 読み込みは以下のようにgetメソッドを使用します。
~~~ hoge_controller.rb
require 'google/cloud/firestore'
class Hoge < ApplicationRecord
  def read
    credentials_hash = JSON.parse(ENV['GOOGLE_CLOUD_CREDENTIALS_JSON']) # 秘密鍵の情報をdotenvから取得し、JSON形式に変換
    firestore = Google::Cloud::Firestore.new(project_id: credentials_hash["project_id"], credentials: credentials_hash)  # firestreインスタンスを作成
    doc_ref = firestore.doc("hoge/fuga") # 読み込み・保存先のパスを指定
    document = doc_ref.get # 読み込み
    put document[:hoge] # プロパティの表示
  end
end
~~~
* 書き込みには以下のようにsetメソッドにHash型の引数を用います。
~~~ hoge_controller.rb
require 'google/cloud/firestore'
class Hoge < ApplicationRecord
  def hoge
    credentials_hash = JSON.parse(ENV['GOOGLE_CLOUD_CREDENTIALS_JSON']) # 秘密鍵の情報をdotenvから取得し、JSON形式に変換
    firestore = Google::Cloud::Firestore.new(project_id: credentials_hash["project_id"], credentials: credentials_hash)  # firestreインスタンスを作成
    doc_ref = firestore.doc("hoge/fuga") # 読み込み・保存先のパスを指定
    doc_ref.set({hoge: HOGE, fuga: FUGA})
  end
end
~~~