annotate gpp/gcalendar/oauth.py @ 458:9a4bffdf37c3

Finishing up #220. Updated to GData v2.0 and using the new OAuth access token.
author Brian Neal <bgneal@gmail.com>
date Sat, 02 Jul 2011 03:52:43 +0000
parents e44dd53885dc
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)