diff --git a/.cliprepo.yaml b/.cliprepo.yaml index 8a7c4b4..c27733e 100644 --- a/.cliprepo.yaml +++ b/.cliprepo.yaml @@ -18,7 +18,7 @@ preset: db_model: - "app/models/*" - "app/db.py" - - "app/auth.py" + # - "app/auth.py" - "app/main.py" graphql: diff --git a/app/auth/__init__.py b/app/auth/__init__.py index 941a26b..70b3434 100644 --- a/app/auth/__init__.py +++ b/app/auth/__init__.py @@ -1,11 +1,50 @@ -from fastapi import APIRouter -from .deps import get_current_user -from .jwt import create_jwt_token, create_refresh_token, verify_access_token +import os +from fastapi import APIRouter, Depends, HTTPException, Request +from app.utils.format import get_image_url -# 统一创建并导出路由器,满足 main.py 的 include_router 需求 +from .deps import get_current_user +from .jwt import create_jwt_token, create_refresh_token, verify_access_token, decode_token +from .oauth import oauth_router + +# 创建全局 auth 路由器 router = APIRouter(tags=["Authentication"]) -# 显式声明这个包对外暴露的接口 +# 挂载第三方 OAuth 的路由器 +router.include_router(oauth_router) + +@router.get("/me") +def me(user_id = Depends(get_current_user)): + # 注意:根据上一轮修改,get_current_user 现在直接返回 user_id + from app.db import SessionLocal + from app.models import User + + db = SessionLocal() + try: + user = db.query(User).filter(User.id == user_id).first() + if not user: + raise HTTPException(status_code=404, detail="User not found") + return { + "email": user.email, + "name": user.name, + "avatar": get_image_url(user.avatar), + } + finally: + db.close() + +@router.post("/refresh") +def refresh_token(refresh_token: str): + payload = decode_token(refresh_token) + if payload.get("type") != "refresh": + raise HTTPException(status_code=401) + user_id = payload.get("sub") + new_access = create_jwt_token({"sub": user_id}) + return {"access_token": new_access} + +@router.post("/logout") +def logout(): + return {"message": "ok"} + +# 显式声明暴露的接口 __all__ = [ "router", "get_current_user", diff --git a/app/auth/deps.py b/app/auth/deps.py index 4e4061d..23e6dd7 100644 --- a/app/auth/deps.py +++ b/app/auth/deps.py @@ -1,6 +1,6 @@ from fastapi import Request, HTTPException import os -from . import jwt +from .jwt import decode_token JWT_SECRET = os.getenv("JWT_SECRET") JWT_ALGORITHM = os.getenv("JWT_ALGORITHM", "HS256") @@ -13,7 +13,7 @@ def get_current_user(request: Request): raise HTTPException(status_code=401, detail="Not authenticated") try: - payload = jwt.decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM]) - return payload["user_id"] + payload = decode_token(token, JWT_SECRET, algorithms=[JWT_ALGORITHM]) + return payload["sub"] except: raise HTTPException(status_code=401, detail="Invalid token") \ No newline at end of file diff --git a/app/auth/oauth/__init__.py b/app/auth/oauth/__init__.py new file mode 100644 index 0000000..00eeaad --- /dev/null +++ b/app/auth/oauth/__init__.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter + +# 导入各个渠道的路由 +from .google import router as google_router +# from .github import router as github_router + +# 创建一个总的 oauth 路由器 +oauth_router = APIRouter() + +# 包含 Google 的路由 +oauth_router.include_router(google_router) +# oauth_router.include_router(github_router) \ No newline at end of file diff --git a/app/auth.py b/app/auth/oauth/google.py similarity index 90% rename from app/auth.py rename to app/auth/oauth/google.py index 060cd69..f2884f9 100644 --- a/app/auth.py +++ b/app/auth/oauth/google.py @@ -170,28 +170,28 @@ async def auth_callback(request: Request, code: str, state: str, background_task # "avatar": get_image_url(user.avatar), # } } + +# @router.get("/me") +# def me(user = Depends(get_current_user)): +# return { +# "email": user.email, +# "name": user.name, +# "avatar": get_image_url(user.avatar), +# } -@router.get("/me") -def me(user = Depends(get_current_user)): - return { - "email": user.email, - "name": user.name, - "avatar": get_image_url(user.avatar), - } - -@router.post("/refresh") -def refresh_token(refresh_token: str): - payload = decode_token(refresh_token) +# @router.post("/refresh") +# def refresh_token(refresh_token: str): +# payload = decode_token(refresh_token) - if payload.get("type") != "refresh": - raise HTTPException(status_code=401) +# if payload.get("type") != "refresh": +# raise HTTPException(status_code=401) - user_id = payload.get("sub") +# user_id = payload.get("sub") - new_access = create_jwt_token({"sub": user_id}) +# new_access = create_jwt_token({"sub": user_id}) - return {"access_token": new_access} +# return {"access_token": new_access} -@router.post("/logout") -def logout(): - return {"message": "ok"} \ No newline at end of file +# @router.post("/logout") +# def logout(): +# return {"message": "ok"} \ No newline at end of file diff --git a/app/main.py b/app/main.py index 6e766c2..277edbe 100644 --- a/app/main.py +++ b/app/main.py @@ -25,4 +25,9 @@ graphql_router = GraphQLRouter(schema, context_getter=get_context) # 挂载路由 app.include_router(auth_router) # 保留现有的 auth 路由供 Google OAuth 回调使用 -app.include_router(graphql_router, prefix="/graphql") # 挂载 GraphQL 终点,前端以后只需要请求 /graphql \ No newline at end of file +app.include_router(graphql_router, prefix="/graphql") # 挂载 GraphQL 终点,前端以后只需要请求 /graphql + +# test code +for route in app.routes: + methods = getattr(route, "methods", "N/A") + print(f"Path: {route.path} | Name: {route.name} | Methods: {methods}") \ No newline at end of file