Skip to content

Instantly share code, notes, and snippets.

@seratch
Last active Mar 6, 2020
Embed
What would you like to do?
twitter oauth example

Twitter 認証付き Sinatra アプリをつくろう

Twitter App を用意

https://apps.twitter.com/

API Keys のタブから「Application settings」を参照して使います。

https://apps.twitter.com/app/***/keys

  • API key
  • API secret

が必要な項目です。

post させるアプリをつくるなら「Access level」が「Read and write」であることを確認してください。

注意点としては「Settings」の「Callback URL」が未設定だとエラーになります。

OmniAuth

OAuth 1.0a, 2.0, OpenID など色々ある認証・認可のプロトコルの差異を吸収して、扱いやすい認証・認可の仕組みをプラグイン機構として提供している gem。

https://github.com/intridea/omniauth

Rails でよく利用されるが Rails だけでなく Sinatra でも利用可能。

Sinatra app with OmniAuth

http://recipes.sinatrarb.com/p/middleware/twitter_authentication_with_omniauth

アプリの起動

bundle exec ruby app.rb
require 'sinatra'
require 'omniauth-twitter'
require 'twitter'
require 'json'
# load ./.env file
require 'dotenv'
Dotenv.load
puts "ENV['TWITTER_CONSUMER_KEY']: #{ENV['TWITTER_CONSUMER_KEY']}"
set :server, :thin
set :session_secret, DateTime.now.to_s
configure do
enable :sessions
use OmniAuth::Builder do
provider :twitter, ENV['TWITTER_CONSUMER_KEY'], ENV['TWITTER_CONSUMER_SECRET']
end
end
helpers do
def logged_in?
session[:twitter_oauth]
end
def twitter
Twitter::REST::Client.new do |config|
config.consumer_key = ENV['TWITTER_CONSUMER_KEY']
config.consumer_secret = ENV['TWITTER_CONSUMER_SECRET']
config.access_token = session[:twitter_oauth][:token]
config.access_token_secret = session[:twitter_oauth][:secret]
end
end
end
before do
pass if request.path_info =~ /^\/auth\//
redirect to('/auth/twitter') unless logged_in?
end
get '/auth/twitter/callback' do
session[:twitter_oauth] = env['omniauth.auth'][:credentials]
redirect to('/')
end
get '/auth/failure' do
end
get '/' do
@oauth = session[:twitter_oauth]
@timeline = twitter.home_timeline
erb :index
end
get '/logout' do
session.clear
redirect to('/')
end
source 'https://rubygems.org/'
gem 'sinatra'
gem 'omniauth-twitter'
gem 'json'
gem 'twitter'
gem 'dotenv'
gem 'thin'
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<a href="/logout">Logout</a><br/>
<hr/>
<h2>Access Token</h2>
<pre><%= JSON.pretty_generate(@oauth) %></pre>
<hr/>
<h2>Home Timeline</h2>
<% @timeline.each do |tweet| %>
<!--<pre><%= JSON.pretty_generate(tweet.attrs) %></pre>-->
<p><%= tweet.text %> by @<%= tweet.user.screen_name %></p>
<% end %>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment