はじめに
Google認証機能周りを調べているときにいろんなコードを参考に、亀さんペースで進めてるわーちゃんと申します。Google認証周りのコードは調べれば調べるほど無限に出てくるのでは?と思っています。
今回はGoogle のクライアント ID やシークレットにアクセスする方法のなかでもcredentials
を使用したコードを調べてみたので、アウトプットしたいと思います
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
早速私がであったコード3つ紹介
Rails.application.credentials
を使用して Google のクライアント ID やシークレットにアクセスする方法として、以下の3つの書き方がありましたので、それぞれの特徴と違いについて説明したいと思います。
1. Rails.application.credentials.dig
を使用する方法
config.google.key = Rails.application.credentials.dig(:google, :google_client_id)
config.google.secret = Rails.application.credentials.dig(:google, :google_client_secret)
特徴:
-
安全性: 存在しないキーにアクセスしようとした場合、
dig
メソッドはnil
を返すため、NoMethodError
が発生しません。 - エラーハンドリング: キーが存在しない場合にエラーを回避するため、安全に使用できます。
- 冗長性: 短いデータ構造に対しては少し冗長に感じるかもしれません。
2. 直接アクセスする方法
config.google.key = Rails.application.credentials.google.google_client_id
config.google.secret = Rails.application.credentials.google.google_client_secret
特徴:
- シンプル: コードが短くなり、簡潔で読みやすいです。
-
エラーのリスク: 存在しないキーにアクセスしようとすると、
NoMethodError
が発生する可能性があります。そのため、キーが必ず存在することが確実な場合に使用するのが適しています。
3. シンボルキーを使ったアクセス方法(3つの中では一番すっきりと見える)
config.google.key = Rails.application.credentials.google[:google_client_id]
config.google.secret = Rails.application.credentials.google[:google_client_secret]
特徴:
-
中間の安全性: キーが存在しない場合、
nil
が返されるため、NoMethodError
は発生しませんが、nil
によるバグが発生する可能性があります。 -
シンプルさと柔軟性: 直接アクセスする方法よりも安全で、
dig
よりも少しシンプルです。ただし、データ構造が深くなる場合には冗長になる可能性があります。
結論: どれがいいのか?
-
安全性を重視する場合:
Rails.application.credentials.dig
を使う方法がおすすめです。エラーハンドリングが自動的に行われるため、コードが安全です。 -
シンプルさを重視し、キーが必ず存在するとわかっている場合: 直接アクセスする方法 (
Rails.application.credentials.google.google_client_id
) が適しています。 -
シンプルさと安全性のバランスを取りたい場合: シンボルキーを使ったアクセス方法 (
Rails.application.credentials.google[:google_client_id]
) が良い選択肢です。
安全性を重視するか、コードのシンプルさを重視するかによって選択が異なりますが、一般的には dig
を使用する方法が推奨されているそうです。
おまけ(W使い)
config.google.key = ENV.fetch('GOOGLE_CLIENT_ID') { Rails.application.credentials.dig(:google, :google_client_id) }
config.google.secret = ENV.fetch('GOOGLE_CLIENT_SECRET') do
Rails.application.credentials.dig(:google, :google_client_secret)
end
特徴:
環境変数が存在する場合はその値を使用し、存在しない場合にはブロック内で指定されたRailsのcredentialsを使用します。ENV.fetch のブロック内で credentials をフォールバックとして利用することで、環境ごとに柔軟に設定を管理できます。
使用場面:
本番環境と開発環境で異なる設定を使用したい場合に便利です。例えば、本番環境では環境変数を優先し、ローカル開発環境ではcredentialsを使用する場合などに適しています。
少し詳しく言い換えると。柔軟性を重視し、環境ごとの設定変更を簡単にしたい場合は、ENV.fetch を使用する方法がおすすめです。これにより、本番環境では環境変数を使用しつつ、ローカル環境ではcredentialsを使うといった設定が可能になります。
さいごに
まさか3種類もコードの書き方が見つかるとは思っていませんでした。+W使いは驚きました。W使いの時はまた別のGemが必要になるそうですが、それはまた別の機会にお伝えすることができればと思います。
今回の記事が何か参考人になれば幸いです。