changeset 13:775e00932285

Added some google openid experimenting
author Atul Varma <avarma@mozilla.com>
date Sun, 13 Jun 2010 16:13:21 -0700
parents 63ea847bfa75
children b8c699d8e613
files google_client.py openid_experiment.py
diffstat 2 files changed, 109 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/google_client.py	Sun Jun 13 16:13:21 2010 -0700
@@ -0,0 +1,56 @@
+import re
+import urlparse
+from wsgiref.util import application_uri
+
+class GoogleOpenIdClientApp(object):
+    AX_NS = "http://openid.net/srv/ax/1.0"
+    FINISHED_URL = re.compile("^/finished/([A-Za-z0-9]+)$")
+
+    def __init__(self, sessions, store, onsuccess, make_consumer):
+        self.make_consumer = make_consumer
+        self.store = store
+        self.sessions = sessions
+        self.onsuccess = onsuccess
+
+    def __call__(self, environ, start_response):
+        path = environ['PATH_INFO']
+
+        appuri = application_uri(environ)
+        if not appuri.endswith('/'):
+            appuri += '/'
+
+        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.addExtensionArg(self.AX_NS, "mode", "fetch_request")
+            request.addExtensionArg(self.AX_NS, "type.email", "http://axschema.org/contact/email")
+            request.addExtensionArg(self.AX_NS, "required", "email")
+            url = request.redirectURL(appuri, "%sfinished/%s" % (appuri, session.id))
+
+            start_response('302 Found',
+                           [('Location', url)])
+            return []
+
+        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))
+                del self.sessions[session_id]
+                start_response('200 OK',
+                               [('Content-Type', 'text/plain')])
+
+                if response.status == "success":
+                    return ["Hi %s" % response.getSigned(self.AX_NS, "value.email")]
+                else:
+                    return ["You declined! %s" % response.status]
+
+        start_response('404 Not Found',
+                       [('Content-Type', 'text/plain')])
+        return ['path not found: %s' % path]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/openid_experiment.py	Sun Jun 13 16:13:21 2010 -0700
@@ -0,0 +1,53 @@
+class TrivialSession(object):
+    def __init__(self, session_id):
+        self.id = session_id
+        self.data = {}
+
+def newkey(numbits=128):
+    return ''.join('%x' % ord(x) for x in os.urandom(numbits/8))
+
+class TrivialSessions(object):
+    def __init__(self):
+        self.sessions = {}
+
+    def create(self):
+        sid = newkey()
+        while sid in self:
+            sid = newkey()
+
+        session = TrivialSession(sid)
+        self.sessions[sid] = session
+        return session
+
+    def __contains__(self, session_id):
+        return session_id in self.sessions
+
+    def __getitem__(self, session_id):
+        return self.sessions[session_id]
+
+    def __delitem__(self, session_id):
+        del self.sessions[session_id]
+
+if __name__ == '__main__':
+    import os
+    from wsgiref.simple_server import make_server
+
+    from openid.store.filestore import FileOpenIDStore
+    from openid.consumer.consumer import Consumer
+    from google_client import GoogleOpenIdClientApp
+
+    storepath = os.path.abspath(os.path.join('storage', 'openid'))
+    if not os.path.exists('storage'):
+        os.mkdir('storage')
+    if not os.path.exists(storepath):
+        os.mkdir(storepath)
+    google = GoogleOpenIdClientApp(
+        sessions=TrivialSessions(),
+        store=FileOpenIDStore(storepath),
+        onsuccess=None,
+        make_consumer=Consumer
+        )
+    port = 8000
+    httpd = make_server('', port, google)
+    print 'serving on port %d' % port
+    httpd.serve_forever()