libushang 6 meses atrás
pai
commit
34dc77d36b
4 arquivos alterados com 162 adições e 1 exclusões
  1. 12 0
      .env
  2. 18 0
      config.py
  3. 4 1
      routers/prod_api/__init__.py
  4. 128 0
      routers/prod_api/zwrz.py

+ 12 - 0
.env

@@ -10,6 +10,10 @@ DEV_MYSQL_PASSWORD = 'c0b0Info@)!%'
 DEV_MYSQL_DB_NAME = 'mmyjhd'
 DEV_MYSQL_PORT = '15012'
 
+# 粤政易
+DEV_YZY_PASS_ID = ''
+DEV_YZY_PASS_TOKEN = ''
+
 #中屏后台管理地址
 DEV_YJHTGL_WEB_ROOT_PATH = "http://127.0.0.1:8086/yjzp/#"
 #小屏地址
@@ -25,6 +29,10 @@ STAGE_MYSQL_PASSWORD = 'ClwXOB~A8f*Q3ijx'
 STAGE_MYSQL_DB_NAME = 'mmyjhd'
 STAGE_MYSQL_PORT = '3306'
 
+# 粤政易
+STAGE_YZY_PASS_ID = 'zwrz_mmzhyj'
+STAGE_YZY_PASS_TOKEN = '8e19726304CD4318laex'
+
 # 中屏后台管理地址
 STAGE_YJHTGL_WEB_ROOT_PATH = "http://19.155.220.206:8086/yjzp/#"
 # STAGE_YJHTGL_WEB_ROOT_PATH = "http://10.181.7.235:8086/yjzp/#"
@@ -43,3 +51,7 @@ PROD_MYSQL_USER = 'dba'
 PROD_MYSQL_PASSWORD = 'ClwXOB~A8f*Q3ijx'
 PROD_MYSQL_DB_NAME = 'mmyjhd'
 PROD_MYSQL_PORT = '3306'
+
+# 粤政易
+PROD_YZY_PASS_ID = 'zwrz_mmzhyj'
+PROD_YZY_PASS_TOKEN = '8e19726304CD4318laex'

+ 18 - 0
config.py

@@ -62,6 +62,13 @@ class DevConfig(Settings):
     YJXP_WEB_ROOT_PATH: Optional[str] = Field(..., env="DEV_YJXP_WEB_ROOT_PATH")
     YJXP_CALLBACK_WEB_PATH: Optional[str] = Field(..., env="DEV_YJXP_CALLBACK_WEB_PATH")
 
+    # 粤政易
+    YZY_PASS_ID: Optional[str] = Field(..., env="DEV_YZY_PASS_ID")
+    YZY_PASS_TOKEN: Optional[str] = Field(..., env="DEV_YZY_PASS_TOKEN")
+    YZY_HOST = "https://xtbg.digitalgd.com.cn"
+    YZY_API_ROOT = "http://19.15.0.128:8080"
+
+
 class ProdConfig(Settings):
 
     IS_DEV: bool = False
@@ -78,6 +85,11 @@ class ProdConfig(Settings):
     YJXP_WEB_ROOT_PATH: Optional[str] = Field(..., env="PROD_YJXP_WEB_ROOT_PATH")
     YJXP_CALLBACK_WEB_PATH: Optional[str] = Field(..., env="PROD_YJXP_CALLBACK_WEB_PATH")
 
+    # 粤政易
+    YZY_PASS_ID: Optional[str] = Field(..., env="PROD_YZY_PASS_ID")
+    YZY_PASS_TOKEN: Optional[str] = Field(..., env="PROD_YZY_PASS_TOKEN")
+    YZY_HOST = "https://xtbg.digitalgd.com.cn"
+    YZY_API_ROOT = "http://19.15.0.128:8080"
 
     REDIS_DB_URL = {
         'host': '127.0.0.1',
@@ -102,6 +114,12 @@ class StageConfig(Settings):
     YJXP_WEB_ROOT_PATH: Optional[str] = Field(..., env="STAGE_YJXP_WEB_ROOT_PATH")
     YJXP_CALLBACK_WEB_PATH: Optional[str] = Field(..., env="STAGE_YJXP_CALLBACK_WEB_PATH")
 
+    # 粤政易
+    YZY_PASS_ID: Optional[str] = Field(..., env="STAGE_YZY_PASS_ID")
+    YZY_PASS_TOKEN: Optional[str] = Field(..., env="STAGE_YZY_PASS_TOKEN")
+    YZY_HOST = "https://xtbg.digitalgd.com.cn"
+    YZY_API_ROOT = "http://19.15.0.128:8080"
+
     REDIS_DB_URL = {
         'host': '127.0.0.1',
         'port': 6379,

+ 4 - 1
routers/prod_api/__init__.py

@@ -6,6 +6,7 @@ from routers.api import upload_file
 from . import system
 from . import auth
 from . import yzy
+from . import zwrz
 
 router = APIRouter()
 
@@ -15,4 +16,6 @@ router.include_router(system.router, prefix="/system")#, dependencies=[Depends(v
 
 router.include_router(upload_file.router, prefix="/file")
 
-router.include_router(yzy.router, prefix="/yzy")
+router.include_router(yzy.router, prefix="/yzy")
+
+router.include_router(zwrz.router)

+ 128 - 0
routers/prod_api/zwrz.py

@@ -0,0 +1,128 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from fastapi import APIRouter, Depends
+from fastapi import Request
+from fastapi.responses import RedirectResponse, PlainTextResponse
+from sqlalchemy.orm import Session
+from database import get_db
+import hashlib
+import uuid
+from common import security
+from models import *
+from common.auth_user import *
+from common import YzyApi
+from config import settings
+from extensions import logger
+import requests
+from exceptions import *
+from urllib.parse import quote
+from utils import *
+from utils.redis_util import *
+from datetime import timedelta
+
+router = APIRouter()
+
+@router.get("/tyrz/login")
+async def login(
+    *,
+    request: Request,
+    code: str,
+    db: Session = Depends(get_db) 
+):
+    logger.info("统一认证登录 code: {}", code)
+
+    print(request.client.host)
+    
+    if code is None or code == '':
+        return PlainTextResponse("统一身份证失败,原因:取code错误")
+
+    get_token_url = settings.TYRZ_GET_TOKEN
+    logger.debug("get_token_url: {}", get_token_url)
+
+    access_token = ''
+    userid = ''
+    mobile = ""
+    sfzh = ""    
+
+    try:
+        headers = {
+            "Content-Type": "application/x-www-form-urlencoded"
+        }
+        data = {
+            "client_id": settings.TYRZ_CLIENT_ID,
+            "grant_type": "authorization_code",
+            "redirect_uri": settings.TYRZ_REDIRECT_URI,
+            "code": code,
+            "client_secret": settings.TYRZ_CLIENT_SECRET
+        }
+        print('data', data)
+        response = requests.post(get_token_url, data=data, headers=headers, timeout=15)
+        print(response.text)
+        if response.status_code == 200 :
+            result = response.json()
+            status = int(result['status'])
+            if status == 0:
+                data = result['data']
+                access_token = data['access_token']
+                expires_in = data['expires_in']
+                userid = data['expires_in']
+            else:
+                message = result['message']
+                return PlainTextResponse("统一身份证失败,原因:"+message)
+    
+        data = {
+            "access_token": access_token
+        }
+        get_token_info_url = settings.TYRZ_GET_TOKEN_INFO
+        response = requests.post(get_token_info_url, data=data, timeout=60)
+        print(response.text)
+        if response.status_code == 200 :
+            result = response.json()
+            status = int(result['status'])
+            if status == 0:
+                data = result['data']
+                mobile = data['mobile']
+                name = data['name']
+                sfzh = data['certificateNumber']
+            else:
+                message = result['message']
+                return PlainTextResponse("统一身份证失败,原因:"+message)
+    except Exception as e:
+        return PlainTextResponse("统一身份证超时,请稍后再试。")
+    
+    row = db.query(SysUser).filter_by(SysUser.yzy_account == mobile).first()
+    if row is None:
+        logger.error("没有匹配的账号绑定用户。")
+        user = {"username": name, "mobile": mobile}
+        return {}
+
+    user_id = str(row.user_id)
+
+    auth = {
+        "user_id": user_id,
+        "user_name": row.user_name,  
+        "nick_name": row.nick_name,
+        "is_yzy_user": "1"
+    }
+
+    request.session['user_auth'] = auth
+    request.session['user_auth_sign'] = data_auth_sign(auth)
+    request.session['user_name'] = row.user_name
+
+    # db_czrz_serv.log_username(db, row.uid, row.username, "登录", "后台管理账号+密码登录成功", request.client.host)
+    row.login_date = datetime.now()
+    row.login_ip = request.client.host
+    # row.login = row.login + 1
+    db.commit()
+
+    access_token_expires = timedelta(seconds = 7200)
+    access_token = security.create_access_token(
+        data={"sub": user_id}, expires_delta = access_token_expires
+    )
+
+    refresh_token_expires = timedelta(seconds = 7200)
+    refresh_token = security.create_access_token(
+        data={"sub": user_id}, expires_delta = refresh_token_expires
+    )
+
+    return RedirectResponse(url="/yjzp/#/login?token="+access_token)