It's raining cats and dogs.

無駄なことなんてないはず

[ruby] omniauth-twitterでOAuth::Unauthorized at /auth/twitter っていうエラーがでる

かなり今更感ありそうなomniauthの話。
omniauthでサクッと認証する部分を作ろうとしたら

OAuth::Unauthorized at /auth/twitter
401 Unauthorized

っていうエラーに遭遇した。

backtraceが出てたけどとりあえずしばらくググったら回答を発見。
OmniAuthのFAQに出てました

https://github.com/intridea/omniauth/wiki/FAQ#how-to-fix-oauthunauthorized-error-for-twitter-provider

twitter開発者向けページでアプリ登録するときにcallback urlは任意だったので、めんどくさくて入力しなかったのが原因みたい。
FAQにある通り、開発者ページで、
callback urlにOmniAuthのtwitter用callback url

http://127.0.0.1:9292/auth/twitter/callback

を設定後、「Recreate my access token」を押して、アプリを動かしてみたら無事動きましたとさ。

※追記
どこかのサイトで見たけど、twitterの開発者ページのoauth settingのaccess levelがread onlyじゃ動かないからread and writeにする的な話は今回の件とは関係ないみたいでした。


以下の手順は完全にメモなので結構どうでもよい(Whatever.)

作業メモ

サンプル用のディレクトリ作ってGemfileをつくる
$ mkdir sample_omniauth
$ cd sample_omniauth
$ bundle init
Gemfileを編集
# A sample Gemfile
source "https://rubygems.org"

gem 'sinatra'
gem 'omniauth-twitter'
bundle install
$ bundle install --path vendor/bundle
sinatraのconfig.ruを作成
# coding: utf-8
require 'rubygems'
require 'bundler'

Bundler.require

require './app.rb'
run Sinatra::Application
app.rbを作成
# coding: utf-8

require 'rubygems'
require 'sinatra'
require 'omniauth'

enable :sessions, :logging

# twitterのkeyとかをomniauthに設定
use OmniAuth::Builder do
  provider :twitter, 'Consumer key', 'Consumer secret'
end

# root
get '/' do
  '<a href="/auth/twitter">twitter</a>'
end

# omniauthのOAuth callback
get '/auth/:name/callback' do
  request.env['omniauth.auth'].inspect
end
アプリをrackup
$ bundle exec rackup config.ru


http://localhost:9292
にアクセスして動作完了