Mercurial > universal-identity-relyer
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()