最近はgithubやcodereposなどの共有レポジトリが流行っています(?)ね。僕はまだコミットした事はないのですが、パスワードなどの秘密の情報が存在するアプリケーションをコミットするときにはどのように秘密部分を加工しているのだろうなー?とずっと疑問に思っていました。
Railsアプリの場合は、クッキーセッションの認証用データを作成するためのシークレットキーがconfig/environment.rbに書かれており(下記の:secretの部分)、ここが秘密部分に当たります。
config.action_controller.session = { :session_key => '_hoge_session', :secret => '4d6c53b43ce6e777251291be7aa191eb80773f332731424c411c3f79bbee485250c6fd24aa8503757cf973e35dfc8a18efb1ce63e26e888431bfa537e6fce4b7' }
普通はその部分だけ消すかxxxxxみたいに適当な値にしてコミットすればいいのでしょうが、それだとupdateしてから実際に動かす前に必ず修正しないといけないし、コミットする前にも消したかどうか確認しないといけないしでとても面倒。
何かうまい方法はあるのかなーとずっと思っていたのですが、今日たまたまfastladderのソースを見ていたら、うまいやり方で解決していて感心したので紹介します。こんな感じ。
secret = "" secret_path = File.join(RAILS_ROOT, "config/secret.txt") if File.exist?(secret_path) secret = open(secret_path) { |io| io.read }.gsub(/\s/, '') end if secret.empty? characters = ("0".."9").to_a + ("a".."f").to_a secret = Array.new(128) { characters[rand(characters.size)] }.join open(secret_path, "w") { |io| io.write(secret) } end config.action_controller.session = { :session_key => '_fastladder_session', :secret => secret }
秘密部分をランダム生成して別ファイルに書き出し→次回以降はファイルから読み込みという訳です。これはRailsアプリを公開したいときに使えるテクニックですねー。