account.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import jwt
  2. from fastapi import FastAPI, HTTPException, Depends, Request
  3. from pydantic import BaseModel
  4. from fastapi.responses import JSONResponse
  5. from test.config import JWT_SECRET_KEY, HOST, PORT
  6. import uvicorn
  7. app = FastAPI()
  8. class ScanCode(BaseModel):
  9. code: str
  10. scopes: str
  11. # 解码并验证JWT
  12. def decode_jwt(token: str):
  13. try:
  14. payload = jwt.decode(token, JWT_SECRET_KEY, algorithms=["HS256"])
  15. return ScanCode(username=payload.get("sub"))
  16. except jwt.PyJWTError as e:
  17. raise HTTPException(status_code=403, detail="Invalid or expired token")
  18. # 登录端点
  19. @app.post("/login")
  20. async def login(user: ScanCode):
  21. # 在这里验证user_credentials(例如,检查username和密码)
  22. # 如果凭证有效,生成并返回token
  23. access_token = jwt.encode({"sub": user.username}, JWT_SECRET_KEY, algorithm="HS256")
  24. return {"token": access_token}
  25. from fastapi.security import OAuth2PasswordBearer
  26. oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
  27. # 创建一个依赖项来获取当前活动用户
  28. def get_current_user(token: str = Depends(oauth2_scheme)):
  29. current_user = decode_jwt(token)
  30. return current_user
  31. # 受保护资源示例
  32. @app.get("/account")
  33. async def read_account(current_user: User = Depends(oauth2_scheme)):
  34. # 在这里返回当前用户的信息
  35. return {"nickname": current_user.username, "avatar": "https://p26.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db.jpeg?from=4010531038"}
  36. # 其他受保护的资源...
  37. # 启动应用
  38. def main():
  39. uvicorn.run(app, host=None, port=PORT, log_level="info")
  40. if __name__ == "__main__":
  41. main()