Advertisement
gatoatigrado3

Dead simple Flask OpenID app

Nov 22nd, 2012
654
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from os.path import dirname, join
  2. from flask import Flask, g, redirect, session
  3. import sqlite3dbm # Simple sqlite3 key-value store written by a coworker
  4. from flask_openid import OpenID
  5.  
  6. app = Flask("my Google OpenID app")
  7. app.secret_key = YOUR RANDOM STRING HERE
  8. oid = OpenID(app, join(dirname(__file__), 'openid_store'))
  9.  
  10. def open_db():
  11.     g.db = getattr(g, 'db', None) or sqlite3dbm.sshelve.open("database.sqlite3")
  12.  
  13. def get_user():
  14.     open_db()
  15.     return g.db.get('oid-' + session.get('openid', ''))
  16.  
  17. @app.before_request
  18. def set_user_if_logged_in():
  19.     open_db() # just to be explicit ...
  20.     g.user = get_user()
  21.  
  22. @app.route("/login")
  23. @oid.loginhandler
  24. def login():
  25.     if g.user is not None:
  26.         return redirect(oid.get_next_url())
  27.     else:
  28.         return oid.try_login("https://www.google.com/accounts/o8/id",
  29.             ask_for=['email', 'fullname', 'nickname'])
  30.  
  31. @oid.after_login
  32. def new_user(resp):
  33.     session['openid'] = resp.identity_url
  34.     if get_user() is None:
  35.         user_id = g.db.get('user-count', 0)
  36.         g.db['user-count'] = user_id + 1
  37.         g.db['oid-' + session['openid']] = {
  38.             'id': user_id,
  39.             'email': resp.email,
  40.             'fullname': resp.fullname,
  41.             'nickname': resp.nickname}
  42.     return redirect(oid.get_next_url())
  43.  
  44. @app.route('/logout')
  45. def logout():
  46.     session.pop('openid', None)
  47.     return redirect(oid.get_next_url())
  48.  
  49. @app.route('/')
  50. def hello():
  51.     if g.user:
  52.         return "hi user %(id)d (email %(email)s). <a href='/logout'>logout</a>" %(g.user)
  53.     else:
  54.         return "not logged in. <a href='/login'>login</a>"
  55.  
  56. if __name__ == "__main__":
  57.     app.run(port=2664, debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement