auth.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. from fastapi import APIRouter, HTTPException
  2. from pydantic import BaseModel
  3. import httpx
  4. from app.core.security import create_access_token
  5. from app.core.config import get_settings
  6. settings = get_settings()
  7. router = APIRouter(prefix="/auth", tags=["鉴权"])
  8. class WechatLoginRequest(BaseModel):
  9. code: str
  10. class LoginResponse(BaseModel):
  11. access_token: str
  12. token_type: str = "bearer"
  13. user_id: str
  14. @router.post("/login/wechat", response_model=LoginResponse)
  15. async def wechat_login(req: WechatLoginRequest):
  16. url = (
  17. f"https://api.weixin.qq.com/sns/jscode2session"
  18. f"?appid={settings.wechat_appid}"
  19. f"&secret={settings.wechat_secret}"
  20. f"&js_code={req.code}"
  21. f"&grant_type=authorization_code"
  22. )
  23. async with httpx.AsyncClient() as client:
  24. resp = await client.get(url)
  25. data = resp.json()
  26. if "errcode" in data:
  27. raise HTTPException(status_code=400, detail=f"Wechat login failed: {data.get('errmsg')}")
  28. openid = data["openid"]
  29. access_token = create_access_token(data={"sub": openid})
  30. return LoginResponse(access_token=access_token, user_id=openid)