annotate gpp/gcalendar/oauth.py @ 505:a5d11471d031

Refactor the logic in the rate limiter decorator. Check to see if the request was ajax, as the ajax view always returns 200. Have to decode the JSON response to see if an error occurred or not.
author Brian Neal <bgneal@gmail.com>
date Sat, 03 Dec 2011 19:13:38 +0000
parents 9a4bffdf37c3
children
rev   line source
bgneal@451 1 """
bgneal@451 2 This module handles the OAuth integration with Google.
bgneal@451 3
bgneal@451 4 """
bgneal@451 5 from __future__ import with_statement
bgneal@451 6 import logging
bgneal@451 7
bgneal@451 8 import gdata.gauth
bgneal@451 9 from gdata.calendar_resource.client import CalendarResourceClient
bgneal@451 10
bgneal@451 11 from django.conf import settings
bgneal@451 12
bgneal@451 13
bgneal@451 14 logger = logging.getLogger(__name__)
bgneal@451 15 USER_AGENT = 'surfguitar101-gcalendar-v1'
bgneal@451 16 REQ_TOKEN_SESSION_KEY = 'gcalendar oauth request token'
bgneal@451 17
bgneal@451 18
bgneal@451 19 def fetch_auth(request, scopes, callback_url):
bgneal@451 20 """
bgneal@451 21 This function fetches a request token from Google and stores it in the
bgneal@451 22 session. It then returns the authorization URL as a string.
bgneal@451 23
bgneal@451 24 request - the HttpRequest object for the user requesting the token. The
bgneal@451 25 token is stored in the session object attached to this request.
bgneal@451 26
bgneal@451 27 scopes - a list of scope strings that the request token is for. See
bgneal@451 28 http://code.google.com/apis/gdata/faq.html#AuthScopes
bgneal@451 29
bgneal@451 30 callback_url - a string that is the URL that Google should redirect the user
bgneal@451 31 to after the user has authorized our application access to their data.
bgneal@451 32
bgneal@451 33 This function only supports RSA-SHA1 authentication. Settings in the Django
bgneal@451 34 settings module determine the consumer key and path to the RSA private key.
bgneal@451 35 """
bgneal@453 36 logger.info("fetch_auth started; callback url='%s'", callback_url)
bgneal@451 37 client = CalendarResourceClient(None, source=USER_AGENT)
bgneal@451 38
bgneal@451 39 with open(settings.GOOGLE_OAUTH_PRIVATE_KEY_PATH, 'r') as f:
bgneal@451 40 rsa_key = f.read()
bgneal@451 41 logger.info("read RSA key; now getting request token")
bgneal@451 42
bgneal@451 43 request_token = client.GetOAuthToken(
bgneal@451 44 scopes,
bgneal@451 45 callback_url,
bgneal@451 46 settings.GOOGLE_OAUTH_CONSUMER_KEY,
bgneal@451 47 rsa_private_key=rsa_key)
bgneal@451 48
bgneal@451 49 logger.info("received token")
bgneal@451 50 request.session[REQ_TOKEN_SESSION_KEY] = request_token
bgneal@451 51
bgneal@452 52 auth_url = request_token.generate_authorization_url()
bgneal@451 53 logger.info("generated auth url '%s'", str(auth_url))
bgneal@451 54
bgneal@451 55 return str(auth_url)
bgneal@451 56
bgneal@451 57
bgneal@451 58 def get_access_token(request):
bgneal@451 59 """
bgneal@451 60 This function should be called after Google has sent the user back to us
bgneal@451 61 after the user authorized us. We retrieve the oauth token from the request
bgneal@451 62 URL and then upgrade it to an access token. We then return the access token.
bgneal@451 63
bgneal@451 64 """
bgneal@455 65 logger.info("get_access_token called as '%s'", request.get_full_path())
bgneal@451 66
bgneal@451 67 saved_token = request.session.get(REQ_TOKEN_SESSION_KEY)
bgneal@451 68 if saved_token is None:
bgneal@451 69 logger.error("saved request token not found in session!")
bgneal@451 70 return None
bgneal@451 71
bgneal@451 72 logger.info("extracting token...")
bgneal@451 73 request_token = gdata.gauth.AuthorizeRequestToken(saved_token,
bgneal@451 74 request.build_absolute_uri())
bgneal@451 75
bgneal@451 76 logger.info("upgrading to access token...")
bgneal@451 77
bgneal@451 78 client = CalendarResourceClient(None, source=USER_AGENT)
bgneal@451 79 access_token = client.GetAccessToken(request_token)
bgneal@451 80
bgneal@451 81 logger.info("upgraded to access token...")
bgneal@451 82 return access_token
bgneal@458 83
bgneal@458 84
bgneal@458 85 def serialize_token(token):
bgneal@458 86 """
bgneal@458 87 This function turns a token into a string and returns it.
bgneal@458 88
bgneal@458 89 """
bgneal@458 90 return gdata.gauth.TokenToBlob(token)
bgneal@458 91
bgneal@458 92
bgneal@458 93 def deserialize_token(s):
bgneal@458 94 """
bgneal@458 95 This function turns a string into a token returns it. The string must have
bgneal@458 96 previously been created with serialize_token().
bgneal@458 97
bgneal@458 98 """
bgneal@458 99 return gdata.gauth.TokenFromBlob(s)