zwrz.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Depends, Query
  4. from fastapi import Request
  5. from fastapi.responses import RedirectResponse, PlainTextResponse
  6. from sqlalchemy.orm import Session
  7. from database import get_db
  8. import hashlib
  9. import uuid
  10. from common import security
  11. from models import *
  12. from common.auth_user import *
  13. from common import YzyApi
  14. from config import settings
  15. from extensions import logger
  16. import requests
  17. from exceptions import *
  18. from urllib.parse import quote
  19. from utils import *
  20. from utils.redis_util import *
  21. from datetime import timedelta
  22. import traceback
  23. from common.enc import mpfun
  24. from sqlalchemy import text, exists, and_, or_, not_
  25. router = APIRouter()
  26. @router.get("/tyrz/login")
  27. async def login(
  28. *,
  29. request: Request,
  30. code: str,
  31. state: str = Query(None),
  32. db: Session = Depends(get_db)
  33. ):
  34. logger.info("统一认证登录 code: {}, redirect: {}", code, state)
  35. print(request.client.host)
  36. if code is None or code == '':
  37. return PlainTextResponse("统一身份证失败,原因:取code错误")
  38. get_token_url = settings.TYRZ_GET_TOKEN
  39. logger.debug("get_token_url: {}", get_token_url)
  40. state = state[0:4] # 去掉后面的随机数
  41. access_token = ''
  42. userid = ''
  43. mobile = ""
  44. sfzh = ""
  45. try:
  46. headers = {
  47. "Content-Type": "application/x-www-form-urlencoded"
  48. }
  49. data = {
  50. "client_id": settings.TYRZ_CLIENT_ID,
  51. "grant_type": "authorization_code",
  52. "redirect_uri": settings.TYRZ_REDIRECT_URI,
  53. "code": code,
  54. "client_secret": settings.TYRZ_CLIENT_SECRET
  55. }
  56. print('data:', data)
  57. response = requests.post(get_token_url, data=data, headers=headers, timeout=15)
  58. print("统一身份证 response:", response.text)
  59. if response.status_code == 200 :
  60. result = response.json()
  61. status = int(result['status'])
  62. if status == 0:
  63. data = result['data']
  64. access_token = data['access_token']
  65. expires_in = data['expires_in']
  66. userid = data['expires_in']
  67. else:
  68. message = result['message']
  69. return PlainTextResponse("统一身份证失败,原因:"+message)
  70. data = {
  71. "access_token": access_token
  72. }
  73. get_token_info_url = settings.TYRZ_GET_TOKEN_INFO
  74. response = requests.post(get_token_info_url, data=data, timeout=60)
  75. print(response.text)
  76. if response.status_code == 200 :
  77. result = response.json()
  78. status = int(result['status'])
  79. if status == 0:
  80. data = result['data']
  81. userId = data['userId'] # 用户粤政易ID
  82. mobile = data['mobile']
  83. name = data['name']
  84. sfzh = data['certificateNumber']
  85. #units = data['units']
  86. #if len(units) > 0:
  87. # unitPath = units['0']['unitPath']
  88. else:
  89. message = result['message']
  90. return PlainTextResponse("统一身份证失败,原因:"+message)
  91. except Exception as e:
  92. traceback.print_exc()
  93. return PlainTextResponse("统一身份证超时,请稍后再试。")
  94. row = db.query(SysUser).filter(and_(SysUser.status == 0, SysUser.del_flag == '0')) \
  95. .filter(or_(SysUser.yzy_account == mpfun.enc_data(userId), SysUser.phonenumber == mpfun.enc_data(mobile))).first()
  96. if row is None:
  97. logger.error("没有匹配的账号绑定用户。")
  98. user = {"username": name, "mobile": mobile, "userId": userId}
  99. goto_url = f"/{state}/#/noyzyuser"
  100. return RedirectResponse(url=goto_url)
  101. # 保存user_id
  102. code = new_guid()
  103. redis_set_with_time("yzy_" + code, str(row.user_id), 600)
  104. if state == 'yjdp':
  105. goto_url = f"https://yjdp.mmsyjj.cn:8086/{state}/#/yzylogin?code={code}"
  106. else:
  107. goto_url = f"/yjzp/#/yzylogin?code={code}"
  108. logger.info("goto_url: {}", goto_url)
  109. return RedirectResponse(url=goto_url)