changeset 14:b8c699d8e613

google_client now calls onsuccess cb whenever openid itself was successful (even though the user may have 'cancelled' the auth).
author Atul Varma <avarma@mozilla.com>
date Sun, 13 Jun 2010 18:20:06 -0700
parents 775e00932285
children 7a59f0eceee7
files google_client.py openid_experiment.py
diffstat 2 files changed, 24 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/google_client.py	Sun Jun 13 16:13:21 2010 -0700
+++ b/google_client.py	Sun Jun 13 18:20:06 2010 -0700
@@ -4,6 +4,8 @@
 
 class GoogleOpenIdClientApp(object):
     AX_NS = "http://openid.net/srv/ax/1.0"
+    AX_EMAIL = "http://axschema.org/contact/email"
+    GOOGLE_OPENID_URL = "https://www.google.com/accounts/o8/id"
     FINISHED_URL = re.compile("^/finished/([A-Za-z0-9]+)$")
 
     def __init__(self, sessions, store, onsuccess, make_consumer):
@@ -22,12 +24,12 @@
         if path == '/':
             session = self.sessions.create()
             consumer = self.make_consumer(session.data, self.store)
-            url = "https://www.google.com/accounts/o8/id"
-            request = consumer.begin(url)
+            request = consumer.begin(self.GOOGLE_OPENID_URL)
             request.addExtensionArg(self.AX_NS, "mode", "fetch_request")
-            request.addExtensionArg(self.AX_NS, "type.email", "http://axschema.org/contact/email")
+            request.addExtensionArg(self.AX_NS, "type.email", self.AX_EMAIL)
             request.addExtensionArg(self.AX_NS, "required", "email")
-            url = request.redirectURL(appuri, "%sfinished/%s" % (appuri, session.id))
+            url = request.redirectURL(appuri, "%sfinished/%s" %
+                                      (appuri, session.id))
 
             start_response('302 Found',
                            [('Location', url)])
@@ -35,21 +37,23 @@
 
         match = self.FINISHED_URL.match(path)
         if match:
-            # TODO: QUERY_STRING may be empty or absent
             query = dict(urlparse.parse_qsl(environ['QUERY_STRING']))
             session_id = match.group(1)
             if session_id in self.sessions:
                 session = self.sessions[session_id]
                 consumer = self.make_consumer(session.data, self.store)
-                response = consumer.complete(query, "%sfinished/%s" % (appuri, session.id))
+                response = consumer.complete(query, "%sfinished/%s" %
+                                             (appuri, session.id))
                 del self.sessions[session_id]
-                start_response('200 OK',
-                               [('Content-Type', 'text/plain')])
 
+                environ['openid.status'] = response.status
                 if response.status == "success":
-                    return ["Hi %s" % response.getSigned(self.AX_NS, "value.email")]
-                else:
-                    return ["You declined! %s" % response.status]
+                    environ['openid.email'] = response.getSigned(
+                        self.AX_NS,
+                        "value.email"
+                        )
+
+                return self.onsuccess(environ, start_response)
 
         start_response('404 Not Found',
                        [('Content-Type', 'text/plain')])
--- a/openid_experiment.py	Sun Jun 13 16:13:21 2010 -0700
+++ b/openid_experiment.py	Sun Jun 13 18:20:06 2010 -0700
@@ -28,6 +28,14 @@
     def __delitem__(self, session_id):
         del self.sessions[session_id]
 
+def onsuccess(environ, start_response):
+    start_response('200 OK',
+                   [('Content-Type', 'text/plain')])
+
+    if environ['openid.status'] == "success":
+        return ["Hi %s." % environ['openid.email']]
+    return ["alas, %s." % environ['openid.status']]
+
 if __name__ == '__main__':
     import os
     from wsgiref.simple_server import make_server
@@ -44,7 +52,7 @@
     google = GoogleOpenIdClientApp(
         sessions=TrivialSessions(),
         store=FileOpenIDStore(storepath),
-        onsuccess=None,
+        onsuccess=onsuccess,
         make_consumer=Consumer
         )
     port = 8000