{ "info": { "author": "Alexander Potts", "author_email": "alexander@jakkso.com", "bugtrack_url": null, "classifiers": [ "Framework :: Flask", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "## \ud83d\udd25Flask_Blacklist\ud83d\udd25\n\n### What\nIt's a Flask extension designed to work with `flask_sqlalchemy` and `flask_pratorian` to blacklist tokens!\n\nIt stores blacklisted JWT's jti value in an in-memory store, allowing blacklist checks without\ndatabase calls. However, when a token is blacklisted, it is also persisted to the database.\n\n### Why\n\n* Emulate a redis store without actually using redis! \ud83d\udc4d\n * This is almost certainly slower than redis (It's python, after all).\n* Why not, it's an excuse to get to know flask and associated libraries a little bit better. \ud83d\udc4d\n\n### How\nYou *are* using a [virtualenv](https://virtualenv.pypa.io/en/latest/), right?\n\n`pip install flask-blacklist` \n\n\nThen in your app factory function, initialize `Blacklist` *after* you've initialized your ORM.\n\n # In global scope\n from flask_blacklist import Blacklist, is_blacklisted\n db = SQLAlchemy()\n guard = Praetorian()\n bl = Blacklist()\n\n # In the app factory function\n app = Flask(__name__)\n db.init_app(app)\n\n from app.models import Token, User\n bl.init_app(app, Token) # Initialize after your ORM\n\n # is_blacklisted is a helper function that Praetorian uses to determine if a token has been blacklisted\n guard.init_app(app, User, is_blacklisted) \n\nThe Token database model needs to have two different class methods:\n\n* `Token.blacklist_jti` \n * Takes a single parameter, which is the `jti` string extracted from a JWT\n * This method calll persist the blacklisted `jti` string to your database.\n* `Token.get_blacklisted` \n * Should return a list of already blacklisted tokens from the database\n * The tokens returns should have a `jti` attribute containing string extracted from the token you want to blacklist\n\nThen, in the route that needs to invalidate the token:\n\n @auth_blueprint.route(\"/v1/auth/token\", methods=[\"DELETE\"])\n @auth_required\n def invalidate_token():\n token = guard.read_token_from_header()\n jti = guard.extract_jwt_token(token)[\"jti\"]\n bl.blacklist_jti(jti)\n rv, code = {\"success\": True, \"message\": \"token invalidated\"}, 200\n return jsonify(rv), code\n\n
\n\nCopyright 2019 Alexander Potts, MIT license.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jakkso/flask_blacklist", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "flask-blacklist", "package_url": "https://pypi.org/project/flask-blacklist/", "platform": "", "project_url": "https://pypi.org/project/flask-blacklist/", "project_urls": { "Homepage": "https://github.com/jakkso/flask_blacklist" }, "release_url": "https://pypi.org/project/flask-blacklist/0.0.1/", "requires_dist": null, "requires_python": "", "summary": "Token blacklist flask extension", "version": "0.0.1" }, "last_serial": 4948816, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "e372cfd74e9acdb71fd582947da16db8", "sha256": "ad62cee7f3b336f37615dd9aa0efc85992d9fc5ed81418ab17f6244f91447b32" }, "downloads": -1, "filename": "flask_blacklist-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e372cfd74e9acdb71fd582947da16db8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8104, "upload_time": "2019-03-16T21:40:00", "url": "https://files.pythonhosted.org/packages/be/b7/a0d7f569d16c626831f5aca9b41dcf0a84ad91338500c8b1ece2de29f1ac/flask_blacklist-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b2ca8600c5fa4778d886f3058cad03c", "sha256": "0e4b031b1e0ac44decd25a0f1e70b59f2c34f23c508a3eea775e21bcda33d3c5" }, "downloads": -1, "filename": "flask_blacklist-0.0.1.tar.gz", "has_sig": false, "md5_digest": "4b2ca8600c5fa4778d886f3058cad03c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4076, "upload_time": "2019-03-16T21:40:03", "url": "https://files.pythonhosted.org/packages/ca/cf/9b8a7e690483c3e782f980a2b334f2d5ed813b952bff3994aab3b38a6da4/flask_blacklist-0.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e372cfd74e9acdb71fd582947da16db8", "sha256": "ad62cee7f3b336f37615dd9aa0efc85992d9fc5ed81418ab17f6244f91447b32" }, "downloads": -1, "filename": "flask_blacklist-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e372cfd74e9acdb71fd582947da16db8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8104, "upload_time": "2019-03-16T21:40:00", "url": "https://files.pythonhosted.org/packages/be/b7/a0d7f569d16c626831f5aca9b41dcf0a84ad91338500c8b1ece2de29f1ac/flask_blacklist-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b2ca8600c5fa4778d886f3058cad03c", "sha256": "0e4b031b1e0ac44decd25a0f1e70b59f2c34f23c508a3eea775e21bcda33d3c5" }, "downloads": -1, "filename": "flask_blacklist-0.0.1.tar.gz", "has_sig": false, "md5_digest": "4b2ca8600c5fa4778d886f3058cad03c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4076, "upload_time": "2019-03-16T21:40:03", "url": "https://files.pythonhosted.org/packages/ca/cf/9b8a7e690483c3e782f980a2b334f2d5ed813b952bff3994aab3b38a6da4/flask_blacklist-0.0.1.tar.gz" } ] }