Fix bug 7. Also, clean up the app engine template to make the happy path happier.
diff --git a/apiclient/oauth.py b/apiclient/oauth.py
index 7351b36..fe78e61 100644
--- a/apiclient/oauth.py
+++ b/apiclient/oauth.py
@@ -124,18 +124,25 @@
connection_type=None):
"""Modify the request headers to add the appropriate
Authorization header."""
- req = oauth.Request.from_consumer_and_token(
- self.consumer, self.token, http_method=method, http_url=uri)
- req.sign_request(signer, self.consumer, self.token)
- if headers == None:
- headers = {}
- headers.update(req.to_header())
- if 'user-agent' in headers:
- headers['user-agent'] = self.user_agent + ' ' + headers['user-agent']
- else:
- headers['user-agent'] = self.user_agent
- return request_orig(uri, method, body, headers,
- redirections, connection_type)
+ response_code = 302
+ http.follow_redirects = False
+ while response_code in [301, 302]:
+ req = oauth.Request.from_consumer_and_token(
+ self.consumer, self.token, http_method=method, http_url=uri)
+ req.sign_request(signer, self.consumer, self.token)
+ if headers == None:
+ headers = {}
+ headers.update(req.to_header())
+ if 'user-agent' in headers:
+ headers['user-agent'] = self.user_agent + ' ' + headers['user-agent']
+ else:
+ headers['user-agent'] = self.user_agent
+ resp, content = request_orig(uri, method, body, headers,
+ redirections, connection_type)
+ response_code = resp.status
+ if response_code in [301, 302]:
+ uri = resp['location']
+ return resp, content
http.request = new_request
return http
diff --git a/samples/new_project_template/main.py b/samples/new_project_template/main.py
index 026400e..8241908 100755
--- a/samples/new_project_template/main.py
+++ b/samples/new_project_template/main.py
@@ -36,7 +36,11 @@
from google.appengine.ext.webapp.util import login_required
APP_ID = os.environ['APPLICATION_ID']
-STEP2_URI = 'http://%s.appspot.com/auth_return' % APP_ID
+
+if 'Development' in os.environ['SERVER_SOFTWARE']:
+ STEP2_URI = 'http://localhost:8080/auth_return'
+else:
+ STEP2_URI = 'http://%s.appspot.com/auth_return' % APP_ID
class Credentials(db.Model):
@@ -49,29 +53,33 @@
def get(self):
user = users.get_current_user()
storage = StorageByKeyName(Credentials, user.user_id(), 'credentials')
- credentials = storage.get()
http = httplib2.Http()
+ credentials = storage.get()
+
if credentials:
http = credentials.authorize(http)
+
service = build("buzz", "v1", http=http)
- if credentials:
- followers = service.people().list(userId='@me', groupId='@followers').execute()
- self.response.out.write('Hello, you have %s followers!' %
- followers['totalResults'])
- else:
- flow = FlowThreeLegged(service.auth_discovery(),
- consumer_key='anonymous',
- consumer_secret='anonymous',
- user_agent='%s/1.0' % APP_ID,
- domain='anonymous',
- scope='https://www.googleapis.com/auth/buzz',
- xoauth_displayname='App Name')
+ if not credentials:
+ return begin_oauth_flow(self, user, service)
- authorize_url = flow.step1_get_authorize_url(STEP2_URI)
- memcache.set(user.user_id(), pickle.dumps(flow))
- self.redirect(authorize_url)
+ followers = service.people().list(userId='@me', groupId='@followers').execute()
+ self.response.out.write('Hello, you have %s followers!' %
+ followers['totalResults'])
+def begin_oauth_flow(request_handler, user, service):
+ flow = FlowThreeLegged(service.auth_discovery(),
+ consumer_key='anonymous',
+ consumer_secret='anonymous',
+ user_agent='%s/1.0' % APP_ID,
+ domain='anonymous',
+ scope='https://www.googleapis.com/auth/buzz',
+ xoauth_displayname='App Name')
+
+ authorize_url = flow.step1_get_authorize_url(STEP2_URI)
+ memcache.set(user.user_id(), pickle.dumps(flow))
+ request_handler.redirect(authorize_url)
class OAuthHandler(webapp.RequestHandler):