FLASK-PARANOID(1) Flask-Paranoid FLASK-PARANOID(1) (NAME) python-flask-paranoid - Flask-Paranoid Flask . . . . IP (User Agent) . <<>> . (strong session protection) Flask-Login Flask-Login . . Flask-Paranoid : from flask import Flask from flask_paranoid import Paranoid app = Flask(__name__) app.config['SECRET_KEY'] = 'top-secret!' paranoid = Paranoid(app) paranoid.redirect_view = '/' @app.route('/') def index(): return render_template('index.html') Paranoid . (redirect) . . 401 . paranoid.redirect_view : paranoid.redirect_view = '/login' (Absolute URLs) : paranoid.redirect_view = 'https://www.google.com' Flask paranoid.redirect_view : paranoid.redirect_view = 'index' (Blueprint) url_for() : paranoid.redirect_view = 'auth.login' (Callback) paranoid.on_invalid_session . Flask : @paranoid.on_invalid_session def invalid_session(): return 'please login', 401 Flask-Login (override) Flask-Login : login_manager.session_protection = None Flask-Paranoid Flask-Login << >> ("remember me") . Flask-Paranoid (subclasses) . (CHANGING THE TOKEN GENERATION ALGORITHM) SHA256 IP (User Agent) . create_token : class MyParanoid(Paranoid): def create_token(self): pass (Request Context) request . (CHANGING WHERE THE TOKEN IS STORED) Paranoid session['_paranoid_token'] . write_token_to_session() get_token_from_session() : class MyParanoid(Paranoid): def write_token_to_session(self, token): pass def get_token_from_session(self): pass API . Paranoid . : def get_token(username, password): if validate_user(username, password): return encode_jwt(claims={'username': username, 'paranoid_token': paranoid.create_token()}) : class MyParanoid(Paranoid): def write_token_to_session(self, token): # nothing to do here, the paranoid token is inserted in the JWT # by the application pass def get_token_from_session(self): claims = decode_jwt(request.headers['X-API-TOKEN']) if 'paranoid_token' not in claims: abort(401) return claims['paranoid_token'] encode_jwt decode_jwt JWT . JWT X-API-TOKEN . (USING A DIFFERENT SESSION CLEANUP MECHANISM) Flask-Login << >> ("remember me") . clear_session() : class MyParanoid(Paranoid): def clear_session(self, response): pass response . . (AUTHOR) Miguel Grinberg (COPYRIGHT) 2017, Miguel Grinberg December 15, 2025 FLASK-PARANOID(1)