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?

【豆知識】 Google のクライアント ID やシークレットにアクセスする方法について

Last updated at Posted at 2024-08-23

はじめに

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が必要になるそうですが、それはまた別の機会にお伝えすることができればと思います。
今回の記事が何か参考人になれば幸いです。

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?