zwrz.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Depends
  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. router = APIRouter()
  23. @router.get("/tyrz/login")
  24. async def login(
  25. *,
  26. request: Request,
  27. code: str,
  28. db: Session = Depends(get_db)
  29. ):
  30. logger.info("统一认证登录 code: {}", code)
  31. print(request.client.host)
  32. if code is None or code == '':
  33. return PlainTextResponse("统一身份证失败,原因:取code错误")
  34. get_token_url = settings.TYRZ_GET_TOKEN
  35. logger.debug("get_token_url: {}", get_token_url)
  36. access_token = ''
  37. userid = ''
  38. mobile = ""
  39. sfzh = ""
  40. try:
  41. headers = {
  42. "Content-Type": "application/x-www-form-urlencoded"
  43. }
  44. data = {
  45. "client_id": settings.TYRZ_CLIENT_ID,
  46. "grant_type": "authorization_code",
  47. "redirect_uri": settings.TYRZ_REDIRECT_URI,
  48. "code": code,
  49. "client_secret": settings.TYRZ_CLIENT_SECRET
  50. }
  51. print('data', data)
  52. response = requests.post(get_token_url, data=data, headers=headers, timeout=15)
  53. print(response.text)
  54. if response.status_code == 200 :
  55. result = response.json()
  56. status = int(result['status'])
  57. if status == 0:
  58. data = result['data']
  59. access_token = data['access_token']
  60. expires_in = data['expires_in']
  61. userid = data['expires_in']
  62. else:
  63. message = result['message']
  64. return PlainTextResponse("统一身份证失败,原因:"+message)
  65. data = {
  66. "access_token": access_token
  67. }
  68. get_token_info_url = settings.TYRZ_GET_TOKEN_INFO
  69. response = requests.post(get_token_info_url, data=data, timeout=60)
  70. print(response.text)
  71. if response.status_code == 200 :
  72. result = response.json()
  73. status = int(result['status'])
  74. if status == 0:
  75. data = result['data']
  76. mobile = data['mobile']
  77. name = data['name']
  78. sfzh = data['certificateNumber']
  79. else:
  80. message = result['message']
  81. return PlainTextResponse("统一身份证失败,原因:"+message)
  82. except Exception as e:
  83. return PlainTextResponse("统一身份证超时,请稍后再试。")
  84. row = db.query(SysUser).filter_by(SysUser.yzy_account == mobile).first()
  85. if row is None:
  86. logger.error("没有匹配的账号绑定用户。")
  87. user = {"username": name, "mobile": mobile}
  88. return {}
  89. user_id = str(row.user_id)
  90. auth = {
  91. "user_id": user_id,
  92. "user_name": row.user_name,
  93. "nick_name": row.nick_name,
  94. "is_yzy_user": "1"
  95. }
  96. request.session['user_auth'] = auth
  97. request.session['user_auth_sign'] = data_auth_sign(auth)
  98. request.session['user_name'] = row.user_name
  99. # db_czrz_serv.log_username(db, row.uid, row.username, "登录", "后台管理账号+密码登录成功", request.client.host)
  100. row.login_date = datetime.now()
  101. row.login_ip = request.client.host
  102. # row.login = row.login + 1
  103. db.commit()
  104. access_token_expires = timedelta(seconds = 7200)
  105. access_token = security.create_access_token(
  106. data={"sub": user_id}, expires_delta = access_token_expires
  107. )
  108. refresh_token_expires = timedelta(seconds = 7200)
  109. refresh_token = security.create_access_token(
  110. data={"sub": user_id}, expires_delta = refresh_token_expires
  111. )
  112. return RedirectResponse(url="/yjzp/#/login?token="+access_token)