v1.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
  2. from werkzeug.security import check_password_hash
  3. from fastapi import APIRouter, Request, Response
  4. from fastapi import HTTPException, Header
  5. from fastapi.responses import JSONResponse
  6. from hub import methods, Global
  7. router = APIRouter()
  8. # mdb = Global.get_mongodb_client()
  9. # serializer = Serializer(secret_key='casper.com@2021', expires_in=86400 * 100) # debug
  10. serializer = Serializer(secret_key='casper.com@2021', expires_in=86400) # release
  11. def get_token_by_user(user):
  12. """生成token"""
  13. data = {
  14. 'id': user.get('uid'),
  15. 'username': user.get('username'),
  16. 'password': user.get('password'),
  17. }
  18. return serializer.dumps(data).decode('utf-8')
  19. @router.post('/v1/token')
  20. async def get_token(request: Request, response: Response):
  21. """获取令牌"""
  22. methods.debug_log('v1.get_token.28', f"#now at {methods.now_string()}, ip: {request.client.host}")
  23. # --- check key --- # debug
  24. # node_api = NodeApi()
  25. # if not node_api.verify_key():
  26. # return JSONResponse(status_code=401, content=dict(message='not verified!', code=1))
  27. # --- get params ---
  28. params = await request.json()
  29. username = params.get('username')
  30. password = params.get('password')
  31. user = Global.mdb.get_one('UserInfo', {'username': username})
  32. role_info = {'1': '超级管理员'}
  33. # if user:
  34. # role = Global.mdb.get_one_by_id('UserRole', user.get('role_id'))
  35. # role_name = role.get('role_name')
  36. # role_type = role.get('role_type')
  37. # else:
  38. # role_name = ''
  39. # role_type = 0
  40. # --- fail log---
  41. if not user:
  42. data = {
  43. 'username': username,
  44. 'is_login': 'Fail',
  45. 'role_type': user.get('role_type'),
  46. 'login_at': methods.now_ts(),
  47. 'login_ip': request.client.host,
  48. }
  49. Global.mdb.add('UserLoginLog', data)
  50. code = 2
  51. elif not check_password_hash(user['password'], password):
  52. data = {
  53. 'username': username,
  54. 'is_login': 'Fail',
  55. 'role_type': user.get('role_type'),
  56. 'login_at': methods.now_ts(),
  57. 'login_ip': request.client.host,
  58. }
  59. Global.mdb.add('UserLoginLog', data)
  60. code = 3
  61. else:
  62. data = {
  63. 'username': username,
  64. 'role_type': user.get('role_type'),
  65. 'is_login': 'Pass',
  66. 'login_at': methods.now_ts(),
  67. 'login_ip': request.client.host,
  68. }
  69. Global.mdb.add('UserLoginLog', data)
  70. code = 0
  71. # --- 登录失败 ---
  72. if code:
  73. return JSONResponse(status_code=401, content=dict(message='unauthorized access!', code=code))
  74. # --- make token ---
  75. data = {
  76. 'id': str(user['_id']),
  77. 'username': user['username'],
  78. 'password': user['password'],
  79. }
  80. token = serializer.dumps(data).decode('utf-8')
  81. content = dict(
  82. # message='authorization passed.',
  83. # username=username,
  84. # uid=str(user['_id']),
  85. # rid=user.get('role_id'), code=0
  86. code=0,
  87. message='authorization passed.',
  88. data={
  89. 'uid': str(user['_id']),
  90. 'username': username,
  91. 'role': role_info.get(str(user.get('role_type'))),
  92. 'role_type': user.get('role_type'),
  93. 'token': token,
  94. }
  95. )
  96. headers = {'authorization': token}
  97. return JSONResponse(content=content, headers=headers)
  98. async def login_required(request: Request):
  99. """
  100. 检查登录token
  101. methods.debug_log('token.login_required.115', f"#code: {code}")
  102. """
  103. # --- check ---
  104. # if request.method == 'POST':
  105. # sources = await request.json()
  106. # tag = sources.get('tag', 'v1')
  107. # code = int(sources.get('code'))
  108. # # methods.debug_log('token.login_required', f"m-107: code -> {code} | token -> {token}")
  109. # if not token and tag == 'v3' and code in [1102, 8201]:
  110. # methods.debug_log('token.login_required', f"m-103: code -> {code}")
  111. # superuser = Global.mdb.get_one('User', {'username': 'admin'})
  112. # superuser = Global.mdb.get_one('UserInfo', {'username': 'admin'})
  113. # return {
  114. # 'uid': str(superuser.get('_id')),
  115. # 'username': 'admin',
  116. # 'password': 'admin',
  117. # 'role_id': superuser.get('role_id'),
  118. # 'skip_is': True,
  119. # }
  120. # --- check --- todo 屏蔽token验证,正常情况下应放开
  121. # if not token:
  122. # # raise HTTPException(status_code=401, detail='unauthorized access!')
  123. # raise HTTPException(status_code=401, headers=dict(message='unauthorized access!', code='4'))
  124. # --- fill --- todo 屏蔽token验证,正常情况下应放开
  125. # try:
  126. # data = serializer.loads(token)
  127. # user = Global.mdb.get_one_by_id('User', data['id'])
  128. # role_id = user.get('role_id')
  129. # # role_acl = Global.mdb.get_one_by_id('UserRole', role_id).get('role_acl')
  130. # return {
  131. # 'uid': data['id'],
  132. # 'username': data['username'],
  133. # 'password': data['password'],
  134. # 'role_id': role_id,
  135. # }
  136. # except Exception as e:
  137. # # raise HTTPException(status_code=401, detail='unauthorized access!')
  138. # raise HTTPException(status_code=401, headers=dict(message='unauthorized access!', code='5'))
  139. # todo 正常情况下应屏蔽
  140. return {'skip_is': True}