VCR gemでアクセストークンとかをいいかんじにする術

こんばんは。おなかが空きました。きたけーです。

最近、RubyでWeb APIのラッパーライブラリをつくっていて、VCR gemを使っています。 VCR gemは、テストでおこなうHTTPの通信を初回に記録し、次回以降は記録された内容をつかう(通信を偽装する)ことで、テストの実行時間の短縮、再現性の確保を図るライブラリです。(詳しい使い方は vcr/vcr · GitHub を参照のこと)

そんな便利なgemなのですが、Web APIを叩く通信の内容を記録する仕様上、そのままでは、アクセストークンなどの知られたらまずい情報も記録されてしまいます。

filter_sensitive_data option

VCRは、この問題に対応するために filter_sensitive_data optionを用意してくれています。 記述例はこんなかんじ

VCR.config do |c|
  c.stub_with :webmock
  c.cassette_library_dir = 'cassettes'
  c.filter_sensitive_data('<ACCESS_TOKEN>') { ENV['ACCESS_TOKEN'] }
end

こう記述しておくと、filter_sensitive_data メソッドに付いたブロックで評価した内容が通信に含まれていたら(上の記述例だと環境変数になっています。dotenv gemを使って、トークンを.envに記述するとよいでしょう)、記録する際に内容をメソッドの引数(<ACCESS_TOKEN>)に置き換えてくれます。

次回、記録された内容を利用する際は、前回、置き換えた内容をブロックで評価した内容に戻してくれます。

参考サイト