APIキーの取り扱いについて
諸々アプリケーションの開発する際に何かしらのAPIを利用することがあると思います。
それと同時に多くの方々は開発にGitを用い、コミットログを残しながら開発を進めるでしょう。
その際、APIキーがコードに記述されたcommitが存在したままでpushが行われると、APIキーを全世界に晒す形となってしまい、貴方の権限を悪用されてしまう恐れがあります。
API元のサービスによっては膨大な契約等を結ばされたりして目も当てられない金額の請求が...といった事態にも繋がります。
そんな自体を未然に防ぐ為に、APIキーをハードコーディングしない手段を取りましょう。
アップロードの際にキーを隠す
def initialize
@client = Twitter::REST::Client.new do |config|
config.consumer_key = "hogehoge"
config.consumer_secret = "hugahuga"
config.access_token = "hanyahanya"
config.access_token_secret = "honyohonyo"
end
end
例えばTwitterAPIを使用する上でこんなコードがあった場合、gitでcommitする際に
def initialize
@client = Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
end
end
このように記述することで確かにAPIキーの漏洩は防ぐことが出来ます。しかし、
コーディング -> 実行テスト(APIキーを入れる) -> commit(APIキーを隠す)
といったAPIキーの操作はあまりにも手間です。
環境変数とdotenvでAPIキーを管理する
そこで、環境変数とそれを取り込むためのgem 'dotenv'を用いて解決しましょう。
環境変数の設定
$ export API_KEY=hogehoge
上記コマンドでシェル変数API_KEY
にhogehogeを入れ、シェル変数API_KEY
を環境変数にするという一連を行えます。
$ printenv
printenv
で環境変数に設定されているか確認します。
API_KEY=hogehoge
これで環境変数変数の設定ができました、他に必要な値があれば同様に設定をして下さい。
Rubyで環境変数を読み取る
設定した環境変数をrubyで読み取るために'dotenv'のgemを使用します。
gem 'dotenv'
$ bundle
Gemfileに記述をし、bundle installを行います。
require 'dotenv'
puts ENV["API_KEY"]
>>> hogehoge
環境変数に設定したAPI_KEYが読み取れています。
ではこれを先程のTwitterAPIでのコードに置き換えます。
def initialize
@client = Twitter::REST::Client.new do |config|
config.consumer_key = ENV['CONSUMER_KEY']
config.consumer_secret = ENV['CONSUMER_SECRET']
config.access_token = ENV['ACCESS_TOKEN']
config.access_token_secret = ENV['ACCESS_TOKEN_SECRET']
end
end
環境変数CONSUMER_KEY
以下に適当な環境変数を設定することで、自身の環境のでは動作しGitHub等のサイトに掲載しても問題ない形でAPIキーの設定をすることが出来ます。
まとめ
APIコードの漏洩を防ぐ為にはそもそもコードにAPIキー等の要素をベタ書きしない事が重要です。
Rubyに限らず、多くの言語で環境変数の読み取りなどAPIキーを扱う上での方法は存在するのでその都度良い方法を探して安全に取り扱って下さい。