Railsアプリで認証のための情報はバージョン管理に含めないために

OAuth認証使って Rails で、 twitterbot を作ろうとした際に、 「 cunsumer key のあつかいどうすんだよ!」ってなった話。

明確に「これ!」という答えは無いらしく、今回は heroku を使うので以下で紹介する foreman を使う方法にしました。
それ以外の場合は下記に色々な回答があるので、参考にしてください。
http://qa.atmarkit.co.jp/q/2212

一応バージョンは関係無いと思いますが、参考までに

Rails 3.2.6
ruby 1.9.3p194 (2012-04-20 revision 35410)

どんな事するか

Railsアプリ内でに環境変数を用意します。
herokuの仕組みに

ENV['CONSUMER_KEY']
とかやって値を呼び出せる仕組みがあるらしいので、それを利用します。
foreman (こんなやつ: https://github.com/ddollar/foreman )を使いますよ〜

ちなみに、 heroku の環境変数の定義のやり方は下記URLの日記に参考となるものが書いてあります。
http://d.hatena.ne.jp/akiinyo/20120522/1337674131

※ ごめんなさい。まだ自分は試してないのですが、この方は実際にアプリを動かしている実績があるので大丈夫かと、、(同僚なのでよく知ってる)。
http://akiinyo-blog.herokuapp.com/
https://github.com/akiinyo/AkiinyoBlog

やり方

それでは本題ですよ〜

まずは下記を Gemfile に追記したら bundle install を実行。

# Gemfileに記述
gem 'foreman'

続いて、 Procfile を新たに作成します。下記のような書き方で今のところ問題出て無いですが、
詳細を調べたい方は http://blog.daviddollar.org/2011/05/06/introducing-foreman.html を見て下さい

# Procfile の内容
web: bundle exec rails s

                                                                                              • -

~更新(2012/11/23)~
下記のように書かないとHerokuで動かなかったので訂正

# Procfile の内容
web: bundle exec rails server -p $PORT

                                                                                              • -

.env を作成します
ここに、認証に使うための公開するべきでないキーとかを環境変数として定義します。

# .envの中
CONSUMER_KEY=xxxxxxxxxxxxxxxxxxxxxx
CONSUMER_SECRET=xxxxxxxxxxxxxxxxxxxxxx

.gitignore への追加をお忘れなく
これを忘れて .env をcommitとかpushして残してしまっては意味が無いので、

# .gitignoreに追記する内容
.env

最後に、 .envで作成した環境変数を使いたいところで、 ENV['CONSUMER_KEY'] とすれば、ok!

# 任意のファイル
OAuth::Consumer.new(
ENV['CONSUMER_KEY'],
ENV['CONSUMER_SECRET'],
{site: "http://api.twitter.com"}
)

サーバを起動するときは

foreman start
今までの rails s だとダメっぽいですね。


ちなみに、もし foreman を使わないと .env をと ENV['CONSUMER_KEY'] が上手く紐付かず、

OAuth::Unauthorized (401 Unauthorized)
っていって怒らてたりします。