Twitter OAuth authentication using Ruby
Here are the steps involved in using Twitter to authenticate using OAuth... because I wanted this post a few days ago and couldn't find it.
Install the required gems.
sudo gem install json oauth
Set up your application at http://twitter.com/apps. Make sure you choose Browser as your application type and check the box saying that you want to use Twitter for login.
Note that if you make a mistake on the new application form it will default to Client for that application type and uncheck the login box. Make sure you set these correctly!
Here comes the magic. Despite the hugely complicated examples found elsewhere only two actions are required. One sets up the authentication request (the login action) and one handles the authentication being completed (the callback action). If you've used OpenID for authentication before this setup should be pretty familiar.
Your login action will look something like this:
# consumer_key and consumer_secret are from Twitter.
# You'll get them on your application details page.
oauth = OAuth::Consumer.new(consumer_key, consumer_secret,
{ :site => "http://twitter.com" })
# Ask for a token to make a request
url = "http://whatever.com/login/complete"
request_token = oauth.get_request_token(:oauth_callback => url)
# Take a note of the token and the secret. You'll need these later
session[:token] = request_token.token
session[:secret] = request_token.secret
# Send the user to Twitter to be authenticated
redirect_to request_token.authorize_url
Your callback action will look something like this:
# Your callback action will look something like
# this:
#
# Your callback URL will now get a request that contains an
# oauth_verifier. Use this and the request token from earlier to
# construct an access request.
request_token = OAuth::RequestToken.new(oauth, session[:request_token],
session[:request_token_secret])
access_token = request_token.get_access_token(
:oauth_verifier => params[:oauth_verifier])
# consumer_key and consumer_secret are from Twitter.
# You'll get them on your application details page.
oauth = OAuth::Consumer.new(consumer_key, consumer_secret,
{ :site => "http://twitter.com" })
# Get account details from Twitter
response = oauth.request(:get, '/account/verify_credentials.json',
access_token, { :scheme => :query_string })
# Then do stuff with the details
user_info = JSON.parse(response.body)
# Like find the person that logged in...
Person.find_by_twitter_id(user_info["id"])
If after implementing this you keep getting 401 Unauthorized
errors, check that your application is set to browser mode in the Twitter configuration options.
curl -LO http://barkingiguana.com/2009/10/13/twitter-oauth-authentication-using-ruby.html.orig
curl -LO http://barkingiguana.com/2009/10/13/twitter-oauth-authentication-using-ruby.html.orig.asc
gpg --verify twitter-oauth-authentication-using-ruby.html.orig{.asc,}
If you'd like to have a conversation about this post, email craig@barkingiguana.com. I don't bite.