Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ repos:
- id: check-toml

- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: v0.14.0
rev: v0.14.6
hooks:
- id: ruff-check
args:
Expand All @@ -21,7 +21,7 @@ repos:
- id: ruff-format

- repo: https://github.com/astral-sh/uv-pre-commit
rev: 0.9.0
rev: 0.9.12
hooks:
- id: uv-lock
- id: uv-export
Expand Down
25 changes: 3 additions & 22 deletions backend/common/security/jwt.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
from datetime import timedelta
from typing import Any

from fastapi import Depends, HTTPException, Request
from fastapi import Depends, Request
from fastapi.security import HTTPBearer
from fastapi.security.http import HTTPAuthorizationCredentials
from fastapi.security.utils import get_authorization_scheme_param
from jose import ExpiredSignatureError, JWTError, jwt
from pydantic_core import from_json
Expand All @@ -16,31 +15,13 @@
from backend.app.admin.schema.user import GetUserInfoWithRelationDetail
from backend.common.dataclasses import AccessToken, NewToken, RefreshToken, TokenPayload
from backend.common.exception import errors
from backend.common.exception.errors import TokenError
from backend.core.conf import settings
from backend.database.db import async_db_session
from backend.database.redis import redis_client
from backend.utils.timezone import timezone


class CustomHTTPBearer(HTTPBearer):
"""
自定义 HTTPBearer 认证类

Issues: https://github.com/fastapi/fastapi/issues/10177
"""

async def __call__(self, request: Request) -> HTTPAuthorizationCredentials | None:
try:
return await super().__call__(request)
except HTTPException as e:
if e.status_code == 403:
raise TokenError
raise


# JWT authorizes dependency injection
DependsJwtAuth = Depends(CustomHTTPBearer())
# JWT dependency injection
DependsJwtAuth = Depends(HTTPBearer())


def jwt_encode(payload: dict[str, Any]) -> str:
Expand Down
30 changes: 15 additions & 15 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,40 +12,40 @@ license = { text = "MIT" }
requires-python = ">=3.10"
dynamic = ['version']
dependencies = [
"alembic>=1.17.1",
"asgiref>=3.10.0",
"alembic>=1.17.2",
"asgiref>=3.11.0",
"asyncmy>=0.2.10",
"asyncpg>=0.30.0",
"asyncpg>=0.31.0",
"bcrypt>=5.0.0",
"cappa>=0.30.4",
"celery>=5.5.3",
# When celery version < 6.0.0
# https://github.com/celery/celery/issues/7874
"celery-aio-pool>=0.1.0rc8",
"cryptography>=46.0.3",
"dulwich>=0.24.7",
"dulwich>=0.24.10",
"fast-captcha>=0.3.2",
"fastapi-limiter>=0.1.6",
"fastapi-pagination>=0.15.0",
"fastapi[standard-no-fastapi-cloud-cli]>=0.121.1",
"fastapi[standard-no-fastapi-cloud-cli]>=0.122.0",
"flower>=2.0.1",
"gevent>=25.9.1",
"granian>=2.5.7",
"granian>=2.6.0",
"ip2loc>=1.0.0",
"itsdangerous>=2.2.0",
"jinja2>=3.1.6",
"loguru>=0.7.3",
"msgspec>=0.19.0",
"psutil>=7.1.2",
"msgspec>=0.20.0",
"psutil>=7.1.3",
# https://github.com/fastapi-practices/fastapi_best_architecture/issues/887
"psycopg[binary]==3.2.10",
"pwdlib>=0.2.1",
"pydantic>=2.12.3",
"pydantic-settings>=2.11.0",
"pwdlib>=0.3.0",
"pydantic>=2.12.4",
"pydantic-settings>=2.12.0",
"pymysql>=1.1.2",
"python-jose>=3.5.0",
"python-socketio>=5.14.3",
"redis[hiredis]>=7.0.1",
"python-socketio>=5.15.0",
"redis[hiredis]>=7.1.0",
"rtoml>=0.13.0",
"sqlalchemy-crud-plus>=1.13.1",
"sqlalchemy[asyncio]>=2.0.44",
Expand All @@ -60,10 +60,10 @@ dev = [
"pytest-sugar>=1.1.1",
]
lint = [
"prek>=0.2.13",
"prek>=0.2.18",
]
server = [
"aio-pika>=9.5.7",
"aio-pika>=9.5.8",
"wait-for-it>=2.3.0",
]

Expand Down
45 changes: 23 additions & 22 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# This file was autogenerated by uv via the following command:
# uv export -o requirements.txt --no-hashes
-e .
alembic==1.17.1
alembic==1.17.2
# via fastapi-best-architecture
amqp==5.3.1
# via kombu
annotated-doc==0.0.3
annotated-doc==0.0.4
# via fastapi
annotated-types==0.7.0
# via pydantic
Expand All @@ -14,21 +14,21 @@ anyio==4.11.0
# httpx
# starlette
# watchfiles
asgiref==3.10.0
asgiref==3.11.0
# via fastapi-best-architecture
async-timeout==5.0.1 ; python_full_version < '3.11.3'
# via
# asyncpg
# redis
asyncmy==0.2.10
# via fastapi-best-architecture
asyncpg==0.30.0
asyncpg==0.31.0
# via fastapi-best-architecture
bcrypt==5.0.0
# via fastapi-best-architecture
bidict==0.23.1
# via python-socketio
billiard==4.2.2
billiard==4.2.3
# via celery
cappa==0.30.4
# via fastapi-best-architecture
Expand All @@ -39,15 +39,15 @@ celery==5.5.3
# flower
celery-aio-pool==0.1.0rc8
# via fastapi-best-architecture
certifi==2025.10.5
certifi==2025.11.12
# via
# httpcore
# httpx
cffi==2.0.0 ; platform_python_implementation != 'PyPy'
# via
# cryptography
# gevent
click==8.3.0
click==8.3.1
# via
# celery
# click-didyoumean
Expand All @@ -73,24 +73,24 @@ cryptography==46.0.3
# via fastapi-best-architecture
dnspython==2.8.0
# via email-validator
dulwich==0.24.8
dulwich==0.24.10
# via fastapi-best-architecture
ecdsa==0.19.1
# via python-jose
email-validator==2.3.0
# via fastapi
exceptiongroup==1.3.0 ; python_full_version < '3.11'
exceptiongroup==1.3.1 ; python_full_version < '3.11'
# via
# anyio
# pytest
fast-captcha==0.3.2
# via fastapi-best-architecture
fastapi==0.121.1
fastapi==0.122.0
# via
# fastapi-best-architecture
# fastapi-limiter
# fastapi-pagination
fastapi-cli==0.0.14
fastapi-cli==0.0.16
# via fastapi
fastapi-limiter==0.1.6
# via fastapi-best-architecture
Expand All @@ -100,7 +100,7 @@ flower==2.0.1
# via fastapi-best-architecture
gevent==25.9.1
# via fastapi-best-architecture
granian==2.5.7
granian==2.6.0
# via fastapi-best-architecture
greenlet==3.2.4
# via
Expand Down Expand Up @@ -150,7 +150,7 @@ markupsafe==3.0.3
# mako
mdurl==0.1.2
# via markdown-it-py
msgspec==0.19.0
msgspec==0.20.0
# via fastapi-best-architecture
packaging==25.0
# via
Expand All @@ -160,7 +160,7 @@ pillow==12.0.0
# via fast-captcha
pluggy==1.6.0
# via pytest
prek==0.2.13
prek==0.2.18
prometheus-client==0.23.1
# via flower
prompt-toolkit==3.0.52
Expand Down Expand Up @@ -188,15 +188,15 @@ pydantic==2.12.4
# sqlalchemy-crud-plus
pydantic-core==2.41.5
# via pydantic
pydantic-settings==2.11.0
pydantic-settings==2.12.0
# via fastapi-best-architecture
pygments==2.19.2
# via
# pytest
# rich
pymysql==1.1.2
# via fastapi-best-architecture
pytest==9.0.0
pytest==9.0.1
# via pytest-sugar
pytest-sugar==1.1.1
python-dateutil==2.9.0.post0
Expand All @@ -211,13 +211,13 @@ python-jose==3.5.0
# via fastapi-best-architecture
python-multipart==0.0.20
# via fastapi
python-socketio==5.14.3
python-socketio==5.15.0
# via fastapi-best-architecture
pytz==2025.2
# via flower
pyyaml==6.0.3
# via uvicorn
redis==7.0.1
redis==7.1.0
# via
# fastapi-best-architecture
# fastapi-limiter
Expand All @@ -226,7 +226,7 @@ rich==14.2.0
# cappa
# rich-toolkit
# typer
rich-toolkit==0.15.1
rich-toolkit==0.16.0
# via fastapi-cli
rsa==4.9.1
# via python-jose
Expand All @@ -251,7 +251,7 @@ sqlalchemy-crud-plus==1.13.1
# via fastapi-best-architecture
sqlparse==0.5.3
# via fastapi-best-architecture
starlette==0.49.3
starlette==0.50.0
# via
# fastapi
# starlette-context
Expand All @@ -262,6 +262,7 @@ termcolor==3.2.0
tomli==2.3.0 ; python_full_version < '3.11'
# via
# alembic
# fastapi-cli
# pytest
tornado==6.5.2
# via flower
Expand Down Expand Up @@ -325,9 +326,9 @@ websockets==15.0.1
# via uvicorn
win32-setctime==1.2.0 ; sys_platform == 'win32'
# via loguru
wsproto==1.2.0
wsproto==1.3.2
# via simple-websocket
zope-event==6.1
# via gevent
zope-interface==8.0.1
zope-interface==8.1.1
# via gevent
Loading