Created
March 17, 2016 03:38
-
-
Save bobquest33/21254f4bd7fd1a27cea5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from flask import current_app, g, Flask | |
| from flask.ext.sqlalchemy import SQLAlchemy | |
| from flask.ext.httpauth import HTTPBasicAuth | |
| from passlib.apps import custom_app_context as pwd_context | |
| from itsdangerous import (TimedJSONWebSignatureSerializer | |
| as Serializer, BadSignature, SignatureExpired) | |
| app = Flask(__name__) | |
| db = SQLAlchemy(app) | |
| auth = HTTPBasicAuth() | |
| app.config['SECRET_KEY'] = 'the quick brown fox jumps over the lazy dog' | |
| app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite' | |
| app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True | |
| class User(db.Model): | |
| __tablename__ = 'users' | |
| id = db.Column(db.Integer, primary_key=True) | |
| username = db.Column(db.String(32), index=True) | |
| password_hash = db.Column(db.String(64)) | |
| def hash_password(self, password): | |
| self.password_hash = pwd_context.encrypt(password) | |
| def verify_password(self, password): | |
| return pwd_context.verify(password, self.password_hash) | |
| def generate_auth_token(self, expiration=600): | |
| s = Serializer(app.config['SECRET_KEY'], expires_in=expiration) | |
| return s.dumps({'id': self.id}) | |
| @staticmethod | |
| def verify_auth_token(token): | |
| s = Serializer(app.config['SECRET_KEY']) | |
| try: | |
| data = s.loads(token) | |
| except SignatureExpired: | |
| return None # valid token, but expired | |
| except BadSignature: | |
| return None # invalid token | |
| user = User.query.get(data['id']) | |
| return user | |
| @auth.verify_password | |
| def verify_password(username_or_token, password): | |
| # first try to authenticate by token | |
| user = User.verify_auth_token(username_or_token) | |
| if not user: | |
| # try to authenticate with username/password | |
| user = User.query.filter_by(username=username_or_token).first() | |
| if not user or not user.verify_password(password): | |
| return False | |
| g.user = user | |
| return True |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment