api_routes_jwt.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # -*- coding: utf-8 -*-
  2. from fastapi import FastAPI, Form, HTTPException, Request, status, APIRouter
  3. import jwt
  4. from jwt.exceptions import ExpiredSignatureError, DecodeError, InvalidAlgorithmError
  5. from core.respone_format import *
  6. from tools.sql_format import UserCRUD
  7. import datetime
  8. import asyncio
  9. from tools.loglog import logger
  10. import traceback
  11. from common.common_data import SECRET_KEY
  12. router = APIRouter()
  13. user_crud = UserCRUD()
  14. def create_access_token(username: str):
  15. payload = {
  16. "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1),
  17. "iat": datetime.datetime.utcnow(),
  18. "username": username
  19. }
  20. try:
  21. encoded_jwt = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
  22. return encoded_jwt
  23. except Exception as e:
  24. logger.info(f"出错日志:创建token中 {payload} 秘钥{SECRET_KEY}")
  25. logger.error(f"{traceback.format_exc()}")
  26. logger.error(f"{type(e).__name__}, {e}")
  27. def verify_token_sync(token: str):
  28. if not token:
  29. return 1
  30. try:
  31. decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
  32. if not decoded_payload.get("username"):
  33. return 2
  34. else:
  35. return 0
  36. except ExpiredSignatureError:
  37. return 3
  38. except (InvalidAlgorithmError, DecodeError):
  39. return 4
  40. async def verify_token(token: str):
  41. loop = asyncio.get_event_loop()
  42. return await loop.run_in_executor(None, verify_token_sync, token)
  43. async def verify_token2(token):
  44. msg_verify_code = await verify_token(token)
  45. if msg_verify_code != 0:
  46. if msg_verify_code == 3:
  47. return resp_401(message="The token has expired")
  48. error_msg = {
  49. 1: "No token provided",
  50. 2: "Token lacks username",
  51. 4: "Token decoding error"
  52. }.get(msg_verify_code, "Invalid token")
  53. return resp_400(message=error_msg)
  54. return 0
  55. @router.post("/user/login")
  56. async def get_token(username: str = Form(...), password: str = Form(...)):
  57. user_info = user_crud.get_userinfo_by_account(username)
  58. if user_info:
  59. userid, account, true_pwd, uname, create_time = user_info
  60. else:
  61. return resp_400(message="user does not exist")
  62. if password == true_pwd:
  63. access_token = create_access_token(username)
  64. return_data = {"access_token": access_token}
  65. return resp_200(data=return_data)
  66. else:
  67. return resp_400(message="Incorrect username or password")
  68. @router.get("/user")
  69. async def get_user(request: Request):
  70. token = request.headers.get("Authorization")
  71. try:
  72. decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
  73. account = decoded_payload.get("username")
  74. user_info = user_crud.get_userinfo_by_account(account=account)
  75. userid, account, true_pwd, uname, create_time = user_info
  76. data = {"id": userid, "name": uname, "account": account, "create_time": create_time}
  77. return resp_200(data=data)
  78. except ExpiredSignatureError:
  79. return resp_401(message="The token has expired")
  80. except (InvalidAlgorithmError, DecodeError):
  81. return resp_400(message="Token decoding error")
  82. except Exception as e:
  83. return resp_400(message=f"Error in get user information.{e}")
  84. @router.post("/user/logout")
  85. async def get_token(request: Request):
  86. token = request.headers.get("Authorization")
  87. try:
  88. decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
  89. account = decoded_payload.get("username")
  90. logger.info(f"账号:{account}注销成功")
  91. data = {"result": "注销成功"}
  92. return resp_200(data=data)
  93. except ExpiredSignatureError:
  94. return resp_401(message="The token has expired")
  95. except (InvalidAlgorithmError, DecodeError):
  96. return resp_400(message="Token decoding error")
  97. except Exception as e:
  98. return resp_400(message=f"User logout error.{e}")