$:.unshift('lib')
+#####!/usr/bin/ruby1.8
+
+# Copyright:: Copyright 2011 Google Inc.
+# License:: All Rights Reserved.
+# Original Author:: Bob Aman
+# Maintainer:: Daniel Dobson (mailto:wolff@google.com)
+# Maintainer:: Jenny Murphy (mailto:mimming@google.com)
+
require 'rubygems'
require 'sinatra'
-require 'datamapper'
require 'google/api_client'
+require 'httpadapter/adapters/net_http'
+require 'pp'
use Rack::Session::Pool, :expire_after => 86400 # 1 day
-# Set up our token store
-DataMapper.setup(:default, 'sqlite::memory:')
-class TokenPair
- include DataMapper::Resource
+# Configuration
+# See README for getting API id and secret
+
+if (ARGV.size < 2)
+ set :oauth_client_id, 'oauth_client_id'
+ set :oauth_client_secret, 'oauth_client_secret'
+
+ if (settings.oauth_client_id == 'oauth_client_id')
+ puts 'See README for getting API id and secret. Server terminated.'
+ exit(0)
+ end
+else
+ set :oauth_client_id, ARGV[0]
+ set :oauth_client_secret, ARGV[1]
+end
- property :id, Serial
- property :refresh_token, String
- property :access_token, String
- property :expires_in, Integer
- property :issued_at, Integer
+# Configuration that you probably don't have to change
+set :oauth_scopes, 'https://www.googleapis.com/auth/buzz'
+
+class TokenPair
+ @refresh_token
+ @access_token
+ @expires_in
+ @issued_at
def update_token!(object)
- self.refresh_token = object.refresh_token
- self.access_token = object.access_token
- self.expires_in = object.expires_in
- self.issued_at = object.issued_at
+ @refresh_token = object.refresh_token
+ @access_token = object.access_token
+ @expires_in = object.expires_in
+ @issued_at = object.issued_at
end
def to_hash
return {
- :refresh_token => refresh_token,
- :access_token => access_token,
- :expires_in => expires_in,
- :issued_at => Time.at(issued_at)
+ :refresh_token => @refresh_token,
+ :access_token => @access_token,
+ :expires_in => @expires_in,
+ :issued_at => Time.at(@issued_at)
}
end
end
-TokenPair.auto_migrate!
+# At the beginning of any request, make sure the OAuth token is available.
+# If it's not available, kick off the OAuth 2 flow to authorize.
before do
- @client = Google::APIClient.new
- @client.authorization.client_id = '245083617981.apps.googleusercontent.com'
- @client.authorization.client_secret = 'pYelZCRjSa+iMezYENVScXFk'
- @client.authorization.scope = 'https://www.googleapis.com/auth/buzz'
+ @client = Google::APIClient.new(
+ :authorization => :oauth_2,
+ :host => 'www.googleapis.com',
+ :http_adapter => HTTPAdapter::NetHTTPAdapter.new
+ )
+
+ @client.authorization.client_id = settings.oauth_client_id
+ @client.authorization.client_secret = settings.oauth_client_secret
+ @client.authorization.scope = settings.oauth_scopes
@client.authorization.redirect_uri = to('/oauth2callback')
@client.authorization.code = params[:code] if params[:code]
- if session[:token_id]
+ if session[:token]
# Load the access token here if it's available
- token_pair = TokenPair.get(session[:token_id])
- @client.authorization.update_token!(token_pair.to_hash)
- end
- if @client.authorization.refresh_token && @client.authorization.expired?
- @client.authorization.fetch_access_token!
+ @client.authorization.update_token!(session[:token].to_hash)
end
+
@buzz = @client.discovered_api('buzz')
unless @client.authorization.access_token || request.path_info =~ /^\/oauth2/
redirect to('/oauth2authorize')
end
end
+# Part of the OAuth flow
get '/oauth2authorize' do
- redirect @client.authorization.authorization_uri.to_s, 303
+ <<OUT
+<!DOCTYPE html>
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>Google Ruby API Buzz Sample</title>
+</head>
+<body>
+<header><h1>Google Ruby API Buzz Sample</h1></header>
+<div class="box">
+<a class='login' href='#{@client.authorization.authorization_uri.to_s}'>Connect Me!</a>
+</div>
+</body>
+</html>
+OUT
end
+# Part of the OAuth flow
get '/oauth2callback' do
@client.authorization.fetch_access_token!
- # Persist the token here
- token_pair = if session[:token_id]
- TokenPair.get(session[:token_id])
- else
- TokenPair.new
+ unless session[:token]
+ token_pair = TokenPair.new
+ token_pair.update_token!(@client.authorization)
+ # Persist the token here
+ session[:token] = token_pair
end
- token_pair.update_token!(@client.authorization)
- token_pair.save()
- session[:token_id] = token_pair.id
redirect to('/')
end
+# The method you're probably actually interested in. This one lists a page of your
+# most recent activities
get '/' do
- result = @client.execute(
+ response = @client.execute(
@buzz.activities.list,
- {'userId' => '@me', 'scope' => '@consumption', 'alt'=> 'json'}
+ 'userId' => '@me', 'scope' => '@consumption', 'alt'=> 'json'
)
- status, _, _ = result.response
- [status, {'Content-Type' => 'application/json'}, JSON.generate(result.data)]
+ status, headers, body = response
+ [status, {'Content-Type' => 'application/json'}, body]
end