omniauth-twitter を使う
omniauth-twitter がやってくれること
具体的には、
use OmniAuth::Builder すると、get /auth/twitter のルーティングを拾い、api.twitter.com やユーザとのやりとりの後、認証できれば /auth/twitter/callback、失敗すれば /auth/failure に帰ってきます。ユーザ情報その他は env['omniauth.auth'] に入ってます。いろいろ入っていますが、
- provider: "twitter"
- uid: "1000xxxxxxxxxx"
- credentials
- secret: "xxxx"
- token: "xxxx"
- info
- name: "ataru_kodaka"
- nickname: "小高 あたる"
などが重要なところかと。たとえば、token = env['omniauth.auth'].credentials.token で取れます。
こちらがやることは、
- twitter でログイン などのリンクをはる
- get '/auth/twitter/callback' で env['omniauth.auth'] からid, name, token, secret などを拾う
- /auth/failure で認証失敗処理
をやればいいですね。
サンプルコード
require 'sinatra/base' require 'sinatra/reloader' require 'omniauth' require 'omniauth-twitter' module TwitterAuth class Application < Sinatra::Base configure do register Sinatra::Reloader enable :sessions end helpers do include ERB::Util enable :inline_templates end consumer_key = "key" consumer_secret = "sekret" use OmniAuth::Builder do provider :twitter, consumer_key, consumer_secret end ################ get '/' do erb "hello world" end get '/auth/twitter/callback' do auth = env['omniauth.auth'] erb auth.inspect end get '/auth/failure' do erb "login failed" end end end __END__ @@layout <html> <head> <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"></script> <script type="text/javascript" src="http://getbootstrap.com/dist/js/bootstrap.min.js"></script> <link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="navbar navbar-default"> <ul class="nav navbar-nav"> <li> <a href="/">top</a> <li> <a href="/auth/twitter">login</a> </ul> </div> <div class="container"> <div class="panel panel-primary"> <div class="panel-heading">title</div> <div class="panel-body"> something here <%= yield %> <hr> <%= env['omniauth.auth'].inspect %> </div> </div> </div> </body> </html>