login.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import datetime
  2. import os
  3. import sys
  4. sys.path.append(os.path.dirname(os.path.dirname(__file__)))
  5. import jwt
  6. from fastapi import FastAPI,APIRouter, HTTPException, Depends, Request,Header
  7. from fastapi import Depends, FastAPI, HTTPException, status
  8. from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
  9. from pydantic import BaseModel
  10. from fastapi.responses import JSONResponse
  11. from config import *
  12. from douyin.access_token import get_access_token
  13. from douyin.user_info import get_user_info
  14. from db.user import UserOAuthRepository,UserInfoRepository,UserOAuthToken
  15. from api.jwt import verify_jwt_token,get_uer_oauth_and_verify
  16. login_router = APIRouter()
  17. # code=676a1101ea02bc5dTaUVtKg8c5enYaGqB4dT 只能被使用一次,用完失效
  18. # scopes=user_info,trial.whitelist 用户授权的范围
  19. class ScanCode(BaseModel):
  20. code: str
  21. scopes: str
  22. class User(BaseModel):
  23. nickname: str
  24. avatar: str
  25. # 登录端点
  26. @login_router.post("/login")
  27. async def login(data: ScanCode):
  28. data = await get_access_token(data.code)
  29. if data.get("error_code") != 0:
  30. return data, status.HTTP_400_BAD_REQUEST
  31. # 计算过期时间戳(基于北京时间)
  32. expires_in = data.get("expires_in", 1296000)
  33. # expires_in = 15
  34. expiration_time_utc = datetime.datetime.utcnow() + datetime.timedelta(seconds=expires_in)
  35. beijing_timezone_delta = datetime.timedelta(hours=8) # 北京时间是UTC+8
  36. expiration_time_beijing = expiration_time_utc + beijing_timezone_delta
  37. exp = int(expiration_time_beijing.timestamp())
  38. # 生成并返回 token,包含过期时间
  39. payload = {
  40. "sub": data["open_id"],
  41. "exp": exp # 添加过期时间戳(北京时间)到 payload
  42. }
  43. account_token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
  44. logger.info(f"login success, expires_time:{datetime.datetime.fromtimestamp(exp).strftime('%Y-%m-%d %H:%M:%S') }, token:{account_token}")
  45. return {"token": account_token}
  46. @login_router.get("/user_info")
  47. async def user_info(db_user_oauth: UserOAuthToken = Depends(get_uer_oauth_and_verify)):
  48. info = await get_user_info(db_user_oauth.open_id, db_user_oauth.access_token)
  49. return info
  50. # 受保护资源示例
  51. @login_router.get("/account")
  52. async def read_account(open_id: str = Depends(verify_jwt_token)):
  53. UserOAuthRepository().display_all_records()
  54. return {"message": "Account information", "open_id": open_id}
  55. # 在这里返回当前用户的信息
  56. return {"nickname": current_user.username, "avatar": "https://p26.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db.jpeg?from=4010531038"}
  57. @login_router.get("/token")
  58. async def read_account(open_id: str = Depends(verify_jwt_token)):
  59. pass
  60. # 启动应用
  61. def main():
  62. pass
  63. if __name__ == "__main__":
  64. main()