Ruby
RubyOnRails
RubyonRails4.0
secrets.yml

Rails + tiwtter loginで OAuth::Unauthorized 400 Bad Requestになった件

More than 3 years have passed since last update.

「パーフェクト Ruby on Rails」のサンプル6章 p168 - p179のログイン処理を書いているときにはまったのでメモ

環境

OS:OS X Yosemite(10.10.5)
Ruby:ruby 2.2.1p85
Rails:4.1.1'

現象

config/secrets.ymlの内容が以下の場合に、サンプル画面(p175 下段図 6.10]のtwitterでログインをクリックすると

OAuth::Unauthorized 400 Bad Requestになった。

config/secrets.yml
default_twitter: &default_twitter
  twitter_api_key: 'dummy api key'
  twitter_api_secret: 'dummy api secret'

development:
  secret_key_base: 46b554f82bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
<<: *default_twitter

test:
  secret_key_base: ea9e9c31d1b1b38250afdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
<<: *default_twitter

パーフェクトRuby on Railsのサンプルを落としてきて、diffを取りsecrets.ymlを以下の様に「<<: *default_twitter」の前に半角スペースを二つ入れて修正したらtitterでログインできた。

config/secrets.yml
default_twitter: &default_twitter
  twitter_api_key: 'dummy api key'
  twitter_api_secret: 'dummy api secret'

development:
  secret_key_base: 46b554f82bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  <<: *default_twitter

test:
  secret_key_base: ea9e9c31d1b1b38250afdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  <<: *default_twitter

他の方に役立つかどうか分かりませんが、とりあえず自分へのメモ

半角スペースが一つの場合はどうなるんだろう。=> WEBrick起動時にエラーになった。

そもそもなんでスペースがないと駄目なんだろう
=> マッピング(ハッシュ形式)の書き方でsecret_key_baseと<<がdevelopmentのキーになっているから半角スペースを二つ入れているということかな?

YAML Validatorを使うと二つの結果に違いがありました。

エラーになった場合のYAML Validatorの結果

config/secrets.yml
default_twitter: 
  twitter_api_key: "dummy api key"
  twitter_api_secret: "dummy api secret"
development: 
  secret_key_base: 46b554f82bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
test: 
  secret_key_base: ea9e9c31d1b1b38250afdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
twitter_api_key: "dummy api key"
twitter_api_secret: "dummy api secret"

エラーにならなかった場合のYAML Validatorの結果

config/secrets.yml
default_twitter: 
  twitter_api_key: "dummy api key"
  twitter_api_secret: "dummy api secret"
development: 
  secret_key_base: 46b554f82bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  twitter_api_key: "dummy api key"
  twitter_api_secret: "dummy api secret"
test: 
  secret_key_base: ea9e9c31d1b1b38250afdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  twitter_api_key: "dummy api key"
  twitter_api_secret: "dummy api secret"

前者の場合developmentとtestにtwitter_api_keyとtwitter_api_secretが含まれていなかったのでtwitter認証時にエラーが出たんだと納得。