satococoa's blog

主にサーバーサイド、Web 系エンジニアのブログです。Go, Ruby, React, GCP, ...etc.

Yokohama.rb #17に参加しました

今回からYokohama.rbの募集はだんさんの作ったBu: betaで募集されるようになりました。
募集ページはここ→Bu: Yokohama.rb #17

既に1ヶ月くらい前の話なので大分内容を忘れてしまっているのですが、だんさんのBu: beta関連でrailsについてみんなで相談事などができたのが面白かったです。
特に大事だと思うがrailsのsessionについての話。

Ruby on Rails Guides: Action Controller Overviewに書いてあるのですが、railsではデフォルトでsessionのデータを全てcookieに保存します。cookieの中身は改ざんはできないように署名付きCookie(Signed Cookie)になっています。そしてその署名のための文字通り秘密鍵となっているのが config/initializers/secret_token.rb です。

…ということはgithubにソースコードを丸ごとあげていて、それをそのままherokuにデプロイしているような場合は要注意ということです。
秘密鍵が丸見えの場合、そいつを使ってcookieを詐称することができるからです。
(↑僕はこういう理解でいるんですが、もし補足や間違っているところがあったら教えて下さい。)

herokuではそういった秘密にしておくデータ、例えばAPIのclient_idやclient_secretなどは$ heroku config:add SOME_KEY=xxxxのようにしてrubyからENV['SOME_KEY']で読むのが一般的です。
当然development環境ではENVとかやるのは面倒なので自動的に生成されたsecret_token.rbをそのまま使えばいいと思います。

最近僕はこういった環境毎に異なる定数の管理にbinarylogic/settingslogic · GitHubを使っていて、以下のように使っています。

config/initializers/secret_token.rb

YourApp::Application.config.secret_token = Settings.secret_token

app/models/settings.rb

class Settings < Settingslogic
  source "#{Rails.root}/config/application.yml"
  namespace Rails.env
end

config/application.yml

defaults: &defaults
  secret_token: 'xxxxxxxxxxxxxxxxxxxxxxx' # 最初にsecret_token.rb内に生成されてた文字列をここに入れた
  github: # たとえばGithub APIを使ってるとか。
    key: 'xxx'
    secret: 'yyy'

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults
  secret_token: <%= ENV['SECRET_TOKEN'] %>
  github:
    key: <%= ENV['GITHUB_KEY'] %>
    secret: <%= ENV['GITHUB_SECRET'] %>