在 ctms-gateway 项目中,apps 目录下的 4 个文件分别负责不同的功能模块。以下是每个文件的详细说明:
1. auth.py
1.1 功能:处理用户认证相关的逻辑。
1.2 主要代码:
async def verify_token(credentials: HTTPAuthorizationCredentials = Depends(security)):
token = credentials.credentials
async with httpx.AsyncClient() as client:
response = await client.get(f"{CTMS_DB_REST_URL}/auth/verify/token?token={token}")
if response.status_code == 200:
return response.json()
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
headers={"WWW-Authenticate": "Bearer"})
1.3 作用:
- 提供 verify_token 函数,用于验证用户 Token 的有效性。
- 通过 HTTP 请求调用后端服务(CTMS_DB_REST_URL)进行 Token 验证。
- 如果验证失败,抛出 HTTPException 异常,返回 401 状态码。
2. auth_view.py
2.1 功能:处理与认证相关的 API 请求。
2.2 主要代码:
@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
async def proxy(request: Request, path: str):
url = f"{CTMS_DB_REST_URL}/auth/{path}"
if len(request.query_params) != 0:
url = f"{url}?{request.query_params}"
async with httpx.AsyncClient() as client:
response = await client.request(
method=request.method,
url=url,
headers={key: value for key, value in request.headers.items() if key!= "host"},
data=await request.body(),
cookies=request.cookies
)
return Response(content=response.content, status_code=response.status_code, headers=dict(response.headers))
2.3作用:
- 提供认证相关的 API 路由,将请求代理到后端服务(CTMS_DB_REST_URL)。
- 支持 GET、POST、PUT、DELETE 方法。
- 处理请求参数、请求头和 Cookie,并将后端服务的响应返回给客户端。
3. views.py
3.1 功能:处理通用的 API 请求。
3.2 主要代码:
@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"], dependencies=[Depends(verify_token)])
async def proxy(request: Request, path: str):
url = f"{CTMS_DB_REST_URL}/{path}"
if len(request.query_params) != 0:
url = f"{url}?{request.query_params}"
async with httpx.AsyncClient() as client:
response = await client.request(
method=request.method,
url=url,
headers={key: value for key, value in request.headers.items() if key!= "host"},
data=await request.body(),
cookies=request.cookies
)
return Response(content=response.content, status_code=response.status_code, headers=dict(response.headers))
3.3 作用:
- 提供通用的 API 路由,将请求代理到后端服务(CTMS_DB_REST_URL)。
- 支持 GET、POST、PUT、DELETE 方法。
- 依赖 verify_token 函数进行 Token 验证,确保请求的安全性。
- 处理请求参数、请求头和 Cookie,并将后端服务的响应返回给客户端。
4. ws_view.py
4.1 功能:处理 WebSocket 请求,实现双向消息转发。
4.2 主要代码:
@app.websocket("/ws/{service_name}/{path:path}", dependencies=[Depends(verify_token)])
async def websocket_proxy(websocket: WebSocket, service_name: str, path: str):
SERVICES = {
"core": CTMS_CORE_WS_URL,
"db": CTMS_DB_WS_URL
}
if service_name not in SERVICES:
await websocket.close(code=1008, reason="Service not found")
return
target_url = f"{SERVICES[service_name]}/{path}"
async with httpx.AsyncClient() as client:
async with client.stream("GET", target_url) as target_ws:
await websocket.accept()
async def forward_to_client():
async for message in target_ws.aiter_text():
await websocket.send_text(message)
async def forward_to_target():
async for message in websocket.iter_text():
await target_ws.send_text(message)
await asyncio.gather(forward_to_client(), forward_to_target())
4.3 作用:
- 提供 WebSocket 路由,支持与不同服务(如 core 和 db)的双向通信。
- 依赖 verify_token 函数进行 Token 验证,确保连接的安全性。
- 实现客户端与目标服务之间的消息双向转发。
- 如果目标服务不存在,关闭 WebSocket 连接并返回错误信息。
5. 总结
- auth.py:负责 Token 验证逻辑。
- auth_view.py:处理认证相关的 API 请求。
- views.py:处理通用的 API 请求,依赖 Token 验证。
- ws_view.py:处理 WebSocket 请求,实现双向消息转发。
这些文件共同构成了 ctms-gateway 项目的核心功能模块,分别负责认证、API 代理和 WebSocket 通信等功能。
6. 获取源码
- 关注公众号
- 后台发送关键字:ctms-gateway
7. 联系方式
- 公众号:ScienceStudio
- Github: github.com/KandyYe
- 知乎:www.zhihu.com/people/kand…