Railsアプリで認証のための情報はバージョン管理に含めないために
OAuth認証使って Rails で、 twitter の bot を作ろうとした際に、 「 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)っていって怒らてたりします。