0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-11

環境

  • Rails 7.0.3
  • Ruby 3.0.1

参考元

今回の記事を作成するにあったって以下のサイトを参考にしました。
主にこちらを参考にしました。
ファイルを使わない方法(Google Cloudのドキュメント)
dotenv内に改行コードを挿入する方法(秘密鍵に改行コードが含まれているので)

本題

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

事前準備

公式のドキュメントに従ってCloud FireStoreデータベースの作成と秘密鍵の取得をします。

データベースの作成と秘密鍵取得の方法(一応) 1.データベース作成

こちらにアクセスします。

以下のような画面が出てくるはずなので、「プロジェクトを追加」の部分をクリックします。無題2_20220811173206.PNG

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

スクリーンショット 2022-08-11 17.25.45(2).png
以下のような画面が出てくるはずなので、「続行」の部分をクリックします。
スクリーンショット 2022-08-11 17.25.54(2).png
以下のような画面が出てくるはずなので、適当にアカウントを選択します。
スクリーンショット 2022-08-11 17.35.52(2).png
プロダクトが完成したら、以下のような画面が表示されるので、「Cloud Firestore」の部分をクリックし、指示に従ってCloud Firestoreを作成します。
スクリーンショット 2022-08-11 18.22.43(2).png

2.秘密鍵の取得
左上の歯車のマークをクリックし、「ユーザーと権限」をクリックします。
スクリーンショット 2022-08-11 18.32.27.png
「サービス アカウント」をクリックし、「新しい秘密鍵の生成」ボタンをクリックし、その後表示される「キーを生成」をクリックするとキーがダウンロードされます。
スクリーンショット 2022-08-11 18.35.36.png

手順

  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に値として追加します。参考元
補足:dotenvの使い方

.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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?