# fastjwt
<!-- Base badges -->
<p style="text-align:center;">
<a href="https://github.com/ocarinow/fastjwt">
<img src="https://img.shields.io/pypi/pyversions/fastjwt" alt="Supported Python Version" />
</a>
<a href="https://pypi.org/project/fastjwt">
<img src="https://img.shields.io/pypi/v/fastjwt" alt="Package Version" />
</a>
<a href="https://github.com/ocarinow/fastjwt/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/ocarinow/fastjwt" alt="Licence" />
</a>
<a href="https://ocarinow.github.io/fastjwt/">
<img src="https://img.shields.io/badge/docs-available-brightgreen" alt="Documentation"></img>
</a>
</p>
<!-- GitHub Action badges -->
<p style="text-align:center;">
<a href="https://github.com/ocarinow/fastjwt/actions" alt="Build Status">
<img src="https://github.com/ocarinow/fastjwt/actions/workflows/cicd-release.yaml/badge.svg" alt="Build Status" />
</a>
<a href="https://github.com/ocarinow/fastjwt/actions" alt="Test Status">
<img src="https://github.com/ocarinow/fastjwt/actions/workflows/cicd-test.yaml/badge.svg" alt="Test Status" />
</a>
<a href="https://github.com/ocarinow/fastjwt/actions" alt="Publish Status">
<img src="https://github.com/ocarinow/fastjwt/actions/workflows/cicd-publish.yaml/badge.svg" alt="Publish Status" />
</a>
<a href="https://github.com/ocarinow/fastjwt/actions" alt="Publish Status">
<img src="https://github.com/ocarinow/fastjwt/actions/workflows/cicd-documentation.yaml/badge.svg" alt="Documentation Status" />
</a>
</p>
<!-- Code quality badges -->
<p style="text-align:center;">
<a href="https://github.com/ocarinow/fastjwt/actions">
<img src="https://raw.githubusercontent.com/ocarinow/fastjwt/main/docs/badges/coverage.svg" alt="Coverage" />
</a>
<a href="https://github.com/ocarinow/fastjwt/actions">
<img src="https://raw.githubusercontent.com/ocarinow/fastjwt/main/docs/badges/pytest.svg" alt="Tests" />
</a>
<a href="https://github.com/ocarinow/fastjwt/actions">
<img src="https://raw.githubusercontent.com/ocarinow/fastjwt/main/docs/badges/interrogate.svg" alt="Docstring" />
</a>
<a href="https://github.com/ocarinow/fastjwt/actions">
<img src="https://raw.githubusercontent.com/ocarinow/fastjwt/main/docs/badges/flake8.svg" alt="Flake8" />
</a>
</p>
<!-- Activity badges -->
<p style="text-align:center;">
<a href="https://github.com/ocarinow/fastjwt">
<img src="https://img.shields.io/github/issues/ocarinow/fastjwt" alt="Issues" />
</a>
<a href="https://github.com/ocarinow/fastjwt">
<img src="https://img.shields.io/github/issues-pr/ocarinow/fastjwt" alt="Pull Requests" />
</a>
<a href="https://github.com/ocarinow/fastjwt">
<img src="https://img.shields.io/github/repo-size/ocarinow/fastjwt" alt="Repo Size" />
</a>
<a href="https://github.com/ocarinow/fastjwt">
<img src="https://img.shields.io/pypi/dm/fastjwt" alt="Downloads" />
</a>
</p>
<!-- Community badges -->
<p style="text-align:center;">
<a href="https://github.com/ocarinow/fastjwt/stargazers" alt="Stars">
<img src="https://img.shields.io/github/stars/ocarinow/fastjwt?style=social" alt="Stars" />
</a>
<a href="https://github.com/ocarinow/fastjwt" alt="Forks">
<img src="https://img.shields.io/github/forks/ocarinow/fastjwt?style=social" alt="Forks" />
</a>
<a href="https://github.com/ocarinow/fastjwt/watchers" alt="Watchers">
<img src="https://img.shields.io/github/watchers/ocarinow/fastjwt?style=social" alt="Watchers" />
</a>
</p>
FastJWT is a FastAPI Plugin for reusable JWT Authentication Management. **fastjwt** enables easy JSON Web Tokens management within your FastAPI application.
_fastjwt_ is heavily inspired from its Flask equivalent [Flask-JWT-Extended](https://flask-jwt-extended.readthedocs.io/en/stable/), _special thanks to [@vimalloc](https://github.com/vimalloc) fot the amazing work_.
**Documentation**: [https://ocarinow.github.io/fastjwt/](https://ocarinow.github.io/fastjwt/)
## Features
- [X] Encode/Decode JWT for application Authentication
- [X] Automatic JWT detection in request
- [X] JWT in Headers
- [X] JWT in Cookies
- [X] JWT in Query strings
- [X] JWT in JSON Body
- [X] Implicit/Explicit token refresh mechanism
- [X] Freshness state of token
- [X] Route protection
- [X] Token type based protection _(access/refresh)_
- [X] Token freshness protection
- [X] Partial route protection
- [X] Handle custom user logic for revoked token validation
- [X] Handle custom logic for token recipient retrieval _(ORM, pydantic serialization...)_
- [X] Provide FastAPI compliant dependency injection API
- [X] Automatic error handling
- [ ] Scope Management (WIP)
## Setup
### Requirements
FastJWT is built on top of the following dependencies:
- [FastAPI](https://github.com/tiangolo/fastapi) as web framework
- [Pydantic](https://github.com/pydantic/pydantic) as data validation
- [PyJWT](https://github.com/jpadilla/pyjwt) as python implementation of the JSON Web Token standard
FastJWT also relies on [`typing-extensions`](https://pypi.org/project/typing-extensions/) for backward compatibility _(python3.9)_
> Note
>
> FastAPI, while required for **fastjwt**, is not declared as a dependency and must be installed prior with `pip install fastapi`
### Install
```shell
# With pip
pip install fastjwt
# With poetry
poetry add fastjwt
# With pipenv
pipenv install fastjwt
```
## Example
```py
from fastapi import FastAPI, Depends
from fastjwt import FastJWT
app = FastAPI()
security = FastJWT()
@app.get('/login')
def login():
return security.create_access_token(uid='foo')
@app.get('/protected', dependencies=[Depends(security.access_token_required())])
def protected():
return "This is a protected endpoint"
```
## Development
> <span style="color:orange;">**WORK IN PROGRESS**</span>
>
> The development guide is not available yet
## Contributing
> <span style="color:orange;">**WORK IN PROGRESS**</span>
>
> The contribution guide is not available yet
## License
This project is open source under [MIT License](https://github.com/ocarinow/fastjwt/blob/main/LICENSE)
Raw data
{
"_id": null,
"home_page": "https://ocarinow.github.io/fastjwt/",
"name": "fastjwt",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "",
"keywords": "fastapi,jwt,JSON-Web-Token,authentication,security,api",
"author": "Walid BENBIHI",
"author_email": "contact@ocarinow.com",
"download_url": "https://files.pythonhosted.org/packages/37/3e/4ca625d601b168b4c87553455afd74d520f2777a41a7b5fa7950ef6180bd/fastjwt-0.4.1.tar.gz",
"platform": null,
"description": "# fastjwt\n<!-- Base badges -->\n<p style=\"text-align:center;\">\n <a href=\"https://github.com/ocarinow/fastjwt\">\n <img src=\"https://img.shields.io/pypi/pyversions/fastjwt\" alt=\"Supported Python Version\" />\n </a>\n <a href=\"https://pypi.org/project/fastjwt\">\n <img src=\"https://img.shields.io/pypi/v/fastjwt\" alt=\"Package Version\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt/blob/main/LICENSE\">\n <img src=\"https://img.shields.io/github/license/ocarinow/fastjwt\" alt=\"Licence\" />\n </a>\n <a href=\"https://ocarinow.github.io/fastjwt/\">\n <img src=\"https://img.shields.io/badge/docs-available-brightgreen\" alt=\"Documentation\"></img>\n </a>\n</p>\n<!-- GitHub Action badges -->\n<p style=\"text-align:center;\">\n <a href=\"https://github.com/ocarinow/fastjwt/actions\" alt=\"Build Status\">\n <img src=\"https://github.com/ocarinow/fastjwt/actions/workflows/cicd-release.yaml/badge.svg\" alt=\"Build Status\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt/actions\" alt=\"Test Status\">\n <img src=\"https://github.com/ocarinow/fastjwt/actions/workflows/cicd-test.yaml/badge.svg\" alt=\"Test Status\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt/actions\" alt=\"Publish Status\">\n <img src=\"https://github.com/ocarinow/fastjwt/actions/workflows/cicd-publish.yaml/badge.svg\" alt=\"Publish Status\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt/actions\" alt=\"Publish Status\">\n <img src=\"https://github.com/ocarinow/fastjwt/actions/workflows/cicd-documentation.yaml/badge.svg\" alt=\"Documentation Status\" />\n </a>\n</p>\n<!-- Code quality badges -->\n<p style=\"text-align:center;\">\n <a href=\"https://github.com/ocarinow/fastjwt/actions\">\n <img src=\"https://raw.githubusercontent.com/ocarinow/fastjwt/main/docs/badges/coverage.svg\" alt=\"Coverage\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt/actions\">\n <img src=\"https://raw.githubusercontent.com/ocarinow/fastjwt/main/docs/badges/pytest.svg\" alt=\"Tests\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt/actions\">\n <img src=\"https://raw.githubusercontent.com/ocarinow/fastjwt/main/docs/badges/interrogate.svg\" alt=\"Docstring\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt/actions\">\n <img src=\"https://raw.githubusercontent.com/ocarinow/fastjwt/main/docs/badges/flake8.svg\" alt=\"Flake8\" />\n </a>\n</p>\n<!-- Activity badges -->\n<p style=\"text-align:center;\">\n <a href=\"https://github.com/ocarinow/fastjwt\">\n <img src=\"https://img.shields.io/github/issues/ocarinow/fastjwt\" alt=\"Issues\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt\">\n <img src=\"https://img.shields.io/github/issues-pr/ocarinow/fastjwt\" alt=\"Pull Requests\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt\">\n <img src=\"https://img.shields.io/github/repo-size/ocarinow/fastjwt\" alt=\"Repo Size\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt\">\n <img src=\"https://img.shields.io/pypi/dm/fastjwt\" alt=\"Downloads\" />\n </a>\n</p>\n<!-- Community badges -->\n<p style=\"text-align:center;\">\n <a href=\"https://github.com/ocarinow/fastjwt/stargazers\" alt=\"Stars\">\n <img src=\"https://img.shields.io/github/stars/ocarinow/fastjwt?style=social\" alt=\"Stars\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt\" alt=\"Forks\">\n <img src=\"https://img.shields.io/github/forks/ocarinow/fastjwt?style=social\" alt=\"Forks\" />\n </a>\n <a href=\"https://github.com/ocarinow/fastjwt/watchers\" alt=\"Watchers\">\n <img src=\"https://img.shields.io/github/watchers/ocarinow/fastjwt?style=social\" alt=\"Watchers\" />\n </a>\n</p>\n\nFastJWT is a FastAPI Plugin for reusable JWT Authentication Management. **fastjwt** enables easy JSON Web Tokens management within your FastAPI application.\n\n_fastjwt_ is heavily inspired from its Flask equivalent [Flask-JWT-Extended](https://flask-jwt-extended.readthedocs.io/en/stable/), _special thanks to [@vimalloc](https://github.com/vimalloc) fot the amazing work_.\n\n**Documentation**: [https://ocarinow.github.io/fastjwt/](https://ocarinow.github.io/fastjwt/)\n\n## Features\n\n- [X] Encode/Decode JWT for application Authentication\n- [X] Automatic JWT detection in request\n - [X] JWT in Headers\n - [X] JWT in Cookies\n - [X] JWT in Query strings\n - [X] JWT in JSON Body\n- [X] Implicit/Explicit token refresh mechanism\n- [X] Freshness state of token\n- [X] Route protection\n - [X] Token type based protection _(access/refresh)_\n - [X] Token freshness protection\n - [X] Partial route protection\n- [X] Handle custom user logic for revoked token validation\n- [X] Handle custom logic for token recipient retrieval _(ORM, pydantic serialization...)_\n- [X] Provide FastAPI compliant dependency injection API\n- [X] Automatic error handling\n- [ ] Scope Management (WIP)\n\n## Setup\n\n### Requirements\n\nFastJWT is built on top of the following dependencies:\n\n- [FastAPI](https://github.com/tiangolo/fastapi) as web framework\n- [Pydantic](https://github.com/pydantic/pydantic) as data validation\n- [PyJWT](https://github.com/jpadilla/pyjwt) as python implementation of the JSON Web Token standard\n\nFastJWT also relies on [`typing-extensions`](https://pypi.org/project/typing-extensions/) for backward compatibility _(python3.9)_\n\n> Note\n>\n> FastAPI, while required for **fastjwt**, is not declared as a dependency and must be installed prior with `pip install fastapi`\n\n### Install\n\n```shell\n# With pip\npip install fastjwt\n# With poetry\npoetry add fastjwt\n# With pipenv\npipenv install fastjwt\n```\n\n## Example\n\n```py\nfrom fastapi import FastAPI, Depends\nfrom fastjwt import FastJWT\n\napp = FastAPI()\nsecurity = FastJWT()\n\n@app.get('/login')\ndef login():\n return security.create_access_token(uid='foo')\n\n@app.get('/protected', dependencies=[Depends(security.access_token_required())])\ndef protected():\n return \"This is a protected endpoint\"\n```\n\n## Development\n\n> <span style=\"color:orange;\">**WORK IN PROGRESS**</span>\n>\n> The development guide is not available yet\n\n## Contributing\n\n> <span style=\"color:orange;\">**WORK IN PROGRESS**</span>\n>\n> The contribution guide is not available yet\n\n## License\n\nThis project is open source under [MIT License](https://github.com/ocarinow/fastjwt/blob/main/LICENSE)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "FastAPI Plugin for reusable JWT Authentication Management",
"version": "0.4.1",
"project_urls": {
"Homepage": "https://ocarinow.github.io/fastjwt/",
"Repository": "https://github.com/ocarinow/fastjwt"
},
"split_keywords": [
"fastapi",
"jwt",
"json-web-token",
"authentication",
"security",
"api"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "e4769d81fcfbcfaebed16081582ca197f3c93139b1486070bb68a076566c9eec",
"md5": "cc3a0c389206947edeea50f7c8ff3938",
"sha256": "71d0277bc63458b869cc93e38f0e10a8d1b998501ed8cb6875634344cb5ab1bb"
},
"downloads": -1,
"filename": "fastjwt-0.4.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "cc3a0c389206947edeea50f7c8ff3938",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 22646,
"upload_time": "2024-03-07T22:41:49",
"upload_time_iso_8601": "2024-03-07T22:41:49.038447Z",
"url": "https://files.pythonhosted.org/packages/e4/76/9d81fcfbcfaebed16081582ca197f3c93139b1486070bb68a076566c9eec/fastjwt-0.4.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "373e4ca625d601b168b4c87553455afd74d520f2777a41a7b5fa7950ef6180bd",
"md5": "1a5f325aa10f18b2b2643b4570f7afff",
"sha256": "032b644bb3df8b012ccc6b20284989752e866525a9a5bafa49d93c55abf7ee9e"
},
"downloads": -1,
"filename": "fastjwt-0.4.1.tar.gz",
"has_sig": false,
"md5_digest": "1a5f325aa10f18b2b2643b4570f7afff",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 19850,
"upload_time": "2024-03-07T22:41:50",
"upload_time_iso_8601": "2024-03-07T22:41:50.172965Z",
"url": "https://files.pythonhosted.org/packages/37/3e/4ca625d601b168b4c87553455afd74d520f2777a41a7b5fa7950ef6180bd/fastjwt-0.4.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-03-07 22:41:50",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ocarinow",
"github_project": "fastjwt",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "anyio",
"specs": [
[
"==",
"3.6.2"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"22.2.0"
]
]
},
{
"name": "black",
"specs": [
[
"==",
"23.1.0"
]
]
},
{
"name": "bleach",
"specs": [
[
"==",
"6.0.0"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2022.12.7"
]
]
},
{
"name": "cffi",
"specs": [
[
"==",
"1.15.1"
]
]
},
{
"name": "cfgv",
"specs": [
[
"==",
"3.3.1"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"2.0.12"
]
]
},
{
"name": "click-log",
"specs": [
[
"==",
"0.4.0"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.1.3"
]
]
},
{
"name": "colorama",
"specs": [
[
"==",
"0.4.6"
]
]
},
{
"name": "coverage",
"specs": [
[
"==",
"7.2.1"
]
]
},
{
"name": "cryptography",
"specs": [
[
"==",
"39.0.1"
]
]
},
{
"name": "dateparser",
"specs": [
[
"==",
"1.1.7"
]
]
},
{
"name": "defusedxml",
"specs": [
[
"==",
"0.7.1"
]
]
},
{
"name": "distlib",
"specs": [
[
"==",
"0.3.6"
]
]
},
{
"name": "docstr-coverage",
"specs": [
[
"==",
"2.2.0"
]
]
},
{
"name": "docutils",
"specs": [
[
"==",
"0.19"
]
]
},
{
"name": "dotty-dict",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "exceptiongroup",
"specs": [
[
"==",
"1.1.0"
]
]
},
{
"name": "fastapi",
"specs": [
[
"==",
"0.92.0"
]
]
},
{
"name": "filelock",
"specs": [
[
"==",
"3.9.0"
]
]
},
{
"name": "flake8-html",
"specs": [
[
"==",
"0.4.3"
]
]
},
{
"name": "flake8",
"specs": [
[
"==",
"6.0.0"
]
]
},
{
"name": "genbadge",
"specs": [
[
"==",
"1.1.0"
]
]
},
{
"name": "ghp-import",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "gitdb",
"specs": [
[
"==",
"4.0.10"
]
]
},
{
"name": "gitpython",
"specs": [
[
"==",
"3.1.31"
]
]
},
{
"name": "griffe",
"specs": [
[
"==",
"0.25.5"
]
]
},
{
"name": "h11",
"specs": [
[
"==",
"0.14.0"
]
]
},
{
"name": "identify",
"specs": [
[
"==",
"2.5.18"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.4"
]
]
},
{
"name": "importlib-metadata",
"specs": [
[
"==",
"6.0.0"
]
]
},
{
"name": "iniconfig",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "invoke",
"specs": [
[
"==",
"1.7.3"
]
]
},
{
"name": "isort",
"specs": [
[
"==",
"5.12.0"
]
]
},
{
"name": "jaraco-classes",
"specs": [
[
"==",
"3.2.3"
]
]
},
{
"name": "jeepney",
"specs": [
[
"==",
"0.8.0"
]
]
},
{
"name": "jinja2",
"specs": [
[
"==",
"3.1.2"
]
]
},
{
"name": "keyring",
"specs": [
[
"==",
"23.13.1"
]
]
},
{
"name": "markdown",
"specs": [
[
"==",
"3.3.7"
]
]
},
{
"name": "markupsafe",
"specs": [
[
"==",
"2.1.2"
]
]
},
{
"name": "mccabe",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "mergedeep",
"specs": [
[
"==",
"1.3.4"
]
]
},
{
"name": "mkdocs-autorefs",
"specs": [
[
"==",
"0.4.1"
]
]
},
{
"name": "mkdocs-material-extensions",
"specs": [
[
"==",
"1.1.1"
]
]
},
{
"name": "mkdocs-material",
"specs": [
[
"==",
"9.1.1"
]
]
},
{
"name": "mkdocs",
"specs": [
[
"==",
"1.4.2"
]
]
},
{
"name": "mkdocstrings-python",
"specs": [
[
"==",
"0.8.3"
]
]
},
{
"name": "mkdocstrings",
"specs": [
[
"==",
"0.20.0"
]
]
},
{
"name": "mkdocstrings",
"specs": [
[
"==",
"0.20.0"
]
]
},
{
"name": "more-itertools",
"specs": [
[
"==",
"9.1.0"
]
]
},
{
"name": "mypy-extensions",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "nodeenv",
"specs": [
[
"==",
"1.7.0"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"23.0"
]
]
},
{
"name": "pathspec",
"specs": [
[
"==",
"0.11.0"
]
]
},
{
"name": "pillow",
"specs": [
[
"==",
"9.4.0"
]
]
},
{
"name": "pkginfo",
"specs": [
[
"==",
"1.9.6"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "pluggy",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "pre-commit",
"specs": [
[
"==",
"3.1.1"
]
]
},
{
"name": "pycodestyle",
"specs": [
[
"==",
"2.10.0"
]
]
},
{
"name": "pycparser",
"specs": [
[
"==",
"2.21"
]
]
},
{
"name": "pydantic",
"specs": [
[
"==",
"1.10.5"
]
]
},
{
"name": "pyflakes",
"specs": [
[
"==",
"3.0.1"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.14.0"
]
]
},
{
"name": "pyjwt",
"specs": [
[
"==",
"2.6.0"
]
]
},
{
"name": "pymdown-extensions",
"specs": [
[
"==",
"9.10"
]
]
},
{
"name": "pytest-asyncio",
"specs": [
[
"==",
"0.20.3"
]
]
},
{
"name": "pytest-cov",
"specs": [
[
"==",
"4.0.0"
]
]
},
{
"name": "pytest",
"specs": [
[
"==",
"7.2.2"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.8.2"
]
]
},
{
"name": "python-gitlab",
"specs": [
[
"==",
"3.13.0"
]
]
},
{
"name": "python-semantic-release",
"specs": [
[
"==",
"7.33.2"
]
]
},
{
"name": "pytz-deprecation-shim",
"specs": [
[
"==",
"0.1.0.post0"
]
]
},
{
"name": "pytz",
"specs": [
[
"==",
"2022.7.1"
]
]
},
{
"name": "pywin32-ctypes",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "pyyaml-env-tag",
"specs": [
[
"==",
"0.1"
]
]
},
{
"name": "pyyaml",
"specs": [
[
"==",
"6.0"
]
]
},
{
"name": "readme-renderer",
"specs": [
[
"==",
"37.3"
]
]
},
{
"name": "regex",
"specs": [
[
"==",
"2022.10.31"
]
]
},
{
"name": "requests-toolbelt",
"specs": [
[
"==",
"0.10.1"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.27.1"
]
]
},
{
"name": "rfc3986",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "secretstorage",
"specs": [
[
"==",
"3.3.3"
]
]
},
{
"name": "semver",
"specs": [
[
"==",
"2.13.0"
]
]
},
{
"name": "setuptools-scm",
"specs": [
[
"==",
"7.1.0"
]
]
},
{
"name": "setuptools",
"specs": [
[
"==",
"67.4.0"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.16.0"
]
]
},
{
"name": "smmap",
"specs": [
[
"==",
"5.0.0"
]
]
},
{
"name": "sniffio",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "starlette",
"specs": [
[
"==",
"0.25.0"
]
]
},
{
"name": "tomli",
"specs": [
[
"==",
"2.0.1"
]
]
},
{
"name": "tomlkit",
"specs": [
[
"==",
"0.11.6"
]
]
},
{
"name": "tqdm",
"specs": [
[
"==",
"4.64.1"
]
]
},
{
"name": "twine",
"specs": [
[
"==",
"3.8.0"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.5.0"
]
]
},
{
"name": "tzdata",
"specs": [
[
"==",
"2022.7"
]
]
},
{
"name": "tzlocal",
"specs": [
[
"==",
"4.2"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"1.26.14"
]
]
},
{
"name": "uvicorn",
"specs": [
[
"==",
"0.20.0"
]
]
},
{
"name": "virtualenv",
"specs": [
[
"==",
"20.20.0"
]
]
},
{
"name": "watchdog",
"specs": [
[
"==",
"2.3.1"
]
]
},
{
"name": "webencodings",
"specs": [
[
"==",
"0.5.1"
]
]
},
{
"name": "wheel",
"specs": [
[
"==",
"0.38.4"
]
]
},
{
"name": "zipp",
"specs": [
[
"==",
"3.15.0"
]
]
}
],
"lcname": "fastjwt"
}