diff gcalendar/oauth.py @ 581:ee87ea74d46b

For Django 1.4, rearranged project structure for new manage.py.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 May 2012 17:10:48 -0500
parents gpp/gcalendar/oauth.py@9a4bffdf37c3
children 8743c566f712
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcalendar/oauth.py	Sat May 05 17:10:48 2012 -0500
@@ -0,0 +1,99 @@
+"""
+This module handles the OAuth integration with Google.
+
+"""
+from __future__ import with_statement
+import logging
+
+import gdata.gauth
+from gdata.calendar_resource.client import CalendarResourceClient
+
+from django.conf import settings
+
+
+logger = logging.getLogger(__name__)
+USER_AGENT = 'surfguitar101-gcalendar-v1'
+REQ_TOKEN_SESSION_KEY = 'gcalendar oauth request token'
+
+
+def fetch_auth(request, scopes, callback_url):
+    """
+    This function fetches a request token from Google and stores it in the
+    session. It then returns the authorization URL as a string.
+
+    request - the HttpRequest object for the user requesting the token. The
+    token is stored in the session object attached to this request.
+
+    scopes - a list of scope strings that the request token is for. See
+    http://code.google.com/apis/gdata/faq.html#AuthScopes
+
+    callback_url - a string that is the URL that Google should redirect the user
+    to after the user has authorized our application access to their data.
+
+    This function only supports RSA-SHA1 authentication. Settings in the Django
+    settings module determine the consumer key and path to the RSA private key.
+    """
+    logger.info("fetch_auth started; callback url='%s'", callback_url)
+    client = CalendarResourceClient(None, source=USER_AGENT)
+
+    with open(settings.GOOGLE_OAUTH_PRIVATE_KEY_PATH, 'r') as f:
+        rsa_key = f.read()
+    logger.info("read RSA key; now getting request token")
+
+    request_token = client.GetOAuthToken(
+            scopes,
+            callback_url,
+            settings.GOOGLE_OAUTH_CONSUMER_KEY,
+            rsa_private_key=rsa_key)
+
+    logger.info("received token")
+    request.session[REQ_TOKEN_SESSION_KEY] = request_token
+
+    auth_url = request_token.generate_authorization_url()
+    logger.info("generated auth url '%s'", str(auth_url))
+
+    return str(auth_url)
+
+
+def get_access_token(request):
+    """
+    This function should be called after Google has sent the user back to us
+    after the user authorized us. We retrieve the oauth token from the request
+    URL and then upgrade it to an access token. We then return the access token.
+
+    """
+    logger.info("get_access_token called as '%s'", request.get_full_path())
+
+    saved_token = request.session.get(REQ_TOKEN_SESSION_KEY)
+    if saved_token is None:
+        logger.error("saved request token not found in session!")
+        return None
+
+    logger.info("extracting token...")
+    request_token = gdata.gauth.AuthorizeRequestToken(saved_token,
+                        request.build_absolute_uri())
+
+    logger.info("upgrading to access token...")
+
+    client = CalendarResourceClient(None, source=USER_AGENT)
+    access_token = client.GetAccessToken(request_token)
+
+    logger.info("upgraded to access token...")
+    return access_token
+
+
+def serialize_token(token):
+    """
+    This function turns a token into a string and returns it.
+
+    """
+    return gdata.gauth.TokenToBlob(token)
+
+
+def deserialize_token(s):
+    """
+    This function turns a string into a token returns it. The string must have
+    previously been created with serialize_token().
+
+    """
+    return gdata.gauth.TokenFromBlob(s)