Edited at

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認証時にエラーが出たんだと納得。