Skip to content

Commit b009779

Browse files
feat: Token middleware
1 parent 6dd8631 commit b009779

File tree

6 files changed

+86
-4
lines changed

6 files changed

+86
-4
lines changed

backend/apps/system/middleware/__init__.py

Whitespace-only changes.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
from fastapi import Depends
3+
from fastapi.responses import JSONResponse
4+
from starlette.middleware.base import BaseHTTPMiddleware
5+
from common.core.config import settings
6+
# from common.core.deps import get_current_user
7+
from common.utils.whitelist import whiteUtils
8+
9+
class TokenMiddleware(BaseHTTPMiddleware):
10+
11+
def __init__(self, app):
12+
super().__init__(app)
13+
14+
async def dispatch(self, request, call_next):
15+
tokenkey = settings.TOKEN_KEY
16+
if self.is_options(request) or whiteUtils.is_whitelisted(request.url.path):
17+
return await call_next(request)
18+
token = request.headers.get(tokenkey)
19+
if not token or not token.startswith("Bearer "):
20+
return JSONResponse({"error": "Unauthorized"}, status_code=401)
21+
""" user = await get_current_user()
22+
request.state.user = user """
23+
return await call_next(request)
24+
25+
def is_options(self, request):
26+
return request.method == "OPTIONS"
27+
28+

backend/common/core/deps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
SessionDep = Annotated[Session, Depends(get_session)]
2222
TokenDep = Annotated[str, Depends(reusable_oauth2)]
2323

24-
def get_current_user(session: SessionDep, token: TokenDep) -> sys_user:
24+
async def get_current_user(session: SessionDep, token: TokenDep) -> sys_user:
2525
try:
2626
payload = jwt.decode(
2727
token, settings.SECRET_KEY, algorithms=[security.ALGORITHM]

backend/common/utils/whitelist.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# app/utils/whitelist.py
2+
import re
3+
from typing import List, Pattern
4+
from common.core.config import settings
5+
wlist = [
6+
"/docs",
7+
"/login/*",
8+
"*.json",
9+
"*.ico"
10+
]
11+
12+
class WhitelistChecker:
13+
def __init__(self, paths: List[str] = None):
14+
self.whitelist = paths or wlist
15+
self._compiled_patterns: List[Pattern] = []
16+
self._compile_patterns()
17+
18+
def _compile_patterns(self) -> None:
19+
for pattern in self.whitelist:
20+
if "*" in pattern:
21+
regex_pattern = (
22+
pattern.replace(".", r"\.")
23+
.replace("*", ".*")
24+
)
25+
if not pattern.startswith("/"):
26+
regex_pattern = f"^{regex_pattern}$"
27+
else:
28+
regex_pattern = f"^{regex_pattern}$"
29+
try:
30+
self._compiled_patterns.append(re.compile(regex_pattern))
31+
except re.error:
32+
print(f"Invalid regular expression pattern: {pattern}")
33+
34+
def is_whitelisted(self, path: str) -> bool:
35+
prefix = settings.API_V1_STR
36+
if path.startswith(prefix):
37+
path = path[len(prefix):]
38+
if path in self.whitelist:
39+
return True
40+
41+
path = path.rstrip('/')
42+
return any(
43+
pattern.match(path) is not None
44+
for pattern in self._compiled_patterns
45+
)
46+
47+
def add_path(self, path: str) -> None:
48+
49+
if path not in self.whitelist:
50+
self.whitelist.append(path)
51+
if "*" in path:
52+
self._compile_patterns()
53+
54+
whiteUtils = WhitelistChecker()

backend/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
from fastapi.routing import APIRoute
44
from starlette.middleware.cors import CORSMiddleware
55
from apps.api import api_router
6+
from apps.system.middleware.auth import TokenMiddleware
67
from common.core.config import settings
78

8-
99
def custom_generate_unique_id(route: APIRoute) -> str:
1010
return f"{route.tags[0]}-{route.name}"
1111

@@ -28,7 +28,7 @@ def custom_generate_unique_id(route: APIRoute) -> str:
2828
allow_methods=["*"],
2929
allow_headers=["*"],
3030
)
31-
31+
app.add_middleware(TokenMiddleware)
3232
app.include_router(api_router, prefix=settings.API_V1_STR)
3333

3434
if __name__ == "__main__":

frontend/src/utils/request.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class HttpService {
6767
// Add auth token
6868
const token = wsCache.get('user.token')
6969
if (token && config.headers) {
70-
config.headers['X-SQLBOT_TOKEN'] = `Bearer ${token}`
70+
config.headers['X-SQLBOT-TOKEN'] = `Bearer ${token}`
7171
}
7272

7373
// Request logging

0 commit comments

Comments
 (0)