このエラーに出会ってもうすぐ1週間が経ちます。
ググってみると世界中の人がこの401でわちゃわちゃしてました。
HTTPリクエストの情報を見たけど、これではアクセス権限は与えられないので認証できません!
##原因
ググって、発見した原因を多かった順に列挙します。
- アプリの設定画面のCallbackURLに何も入力されていない
- API KEY(CONSUMER KEY)とAPI SECRET(CONSUMER SECRET)の設定が間違っている
- コンピュータの時刻が狂っている(記事下部のコメントも参照してください)
- アプリがTwitterからSuspendされてる
- まだある!・・・!?(情報お持ちの方コメントお願いします・・・!)
##解決法
###1. アプリの設定画面のCallbackURLに何も入力されていない
https://dev.twitter.com/apps でアプリケーションを登録する際に、Callback URLが入力必須項目でないからといって空っぽにしているとWebアプリケーションでは無くデスクトップアプリケーションとして認識しているため、Webアプリケーション上で動作しません。
Callback URLはダミーURLで良いのでとりあえずなにかのURLを入力しておけば良いです。必要になったときに正しいURLに変更すれば良いです。
###2. API_KEY(CONSUMER_KEY)とAPI_SECRET(CONSUMER_SECRET)の設定が間違っている
これはもう論外ですね。ちゃんとドキュメントを読みましょう。
config/initializers/omniauth.rb
を作成して、以下を設定
Rails.application.config.middleware.use OmniAuth::Builder do
provider :twitter, "API_KEY", "API_SECRET"
end
or
ユーザー登録やログインなどの認証ソリューション「Devise」を利用している場合はconfig/initializers/devise.rb
にいろいろ書きます。(詳しくはdeviseのドキュメントへ)
###3. コンピュータの時刻が狂っている(記事下部のコメントも参照してください)
###4. アプリがTwitterからSuspendされてる
Twitterにアプリケーションを登録し直します。一度アプリケーションの登録情報を削除し、もう一度登録します。
###5. それでも解決しない
僕がこれです。
4つ目の「アプリがTwitterからSuspendされてる」はdev.twitter.com/apps でアプリケーションに「Suspended」と表示されていないので関係ないと思いましたが一応上に挙げた解決策を実行しました。
しかし状況はかわらず。それ以外の原因は当てはまらないので他に原因があるはずだと原因を究明中です。一部のプライマリIPアドレスがブロックされている(この辺りがよくわかっていない。プライマリ?第一?セカンダリというのもあるのですね。なるほどわからん)ことが原因という情報も見つけました。
railsアプリケーションの他の部分が影響しているのかもしれないと考え、別に新しくアプリケーションを作り直し、omniauth-twitterのドキュメントにある通り設定してもこのエラーに直面してしまいます。
omniauth-facebookを用いてfacebookでの認証を試みたところ、これはうまくいきました。TwitterAPIには以前、500番台が返ってくるべきエラーが全て401となって返ってくる問題が発生していたことがあるため、今回もそんなことだったらいいななんて思ったりもしてます。