diff --git a/Router/AppRouter.py b/Router/AppRouter.py index d94fca0..d917018 100644 --- a/Router/AppRouter.py +++ b/Router/AppRouter.py @@ -15,7 +15,8 @@ router = APIRouter( # 获取用户基本信息 -@router.post("/get_user_base_info", response_model=AppSchemas.UserBaseInfo) +@router.post("/get_user_base_info", response_model=AppSchemas.UserBaseInfo,summary="获取用户基本信息") def get_user_base_info(payload=Depends(app_auth_token_depend)): return AppSchemas.UserBaseInfo(**payload) +# 用户授权登录 diff --git a/Router/UserRegisterRouter.py b/Router/UserRegisterRouter.py index 8ec6948..2dfdb2b 100644 --- a/Router/UserRegisterRouter.py +++ b/Router/UserRegisterRouter.py @@ -4,8 +4,9 @@ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from Crud.UserCrud import get_user_by_email, create_user, rest_user_password +from Crud import AppCrud from Schemas import UserSchemas -from Utils.AuthUtils import Token, token_data_depend +from Utils.AuthUtils import Token, token_data_depend, create_token from Utils.EncyptUtil import get_encrypt_password from Utils.SqlAlchemyUtils import get_db from Utils.VerifyCodeUtils import EmailVerifyCode, ImageCaptchaVerify, EmailVerifyType @@ -55,6 +56,34 @@ def login(body: UserSchemas.LoginReqBody, db: Session = Depends(get_db)): return UserSchemas.LoginResBody(**user_info, access_token=token, token_type='bearer') +@router.post("/login_to_app", summary="授权应用登录", response_model=UserSchemas.LoginResBody) +def login(body: UserSchemas.LoginReqBody, db: Session = Depends(get_db)): + if not body.app_id: + raise HTTPException(status_code=202, detail="未传入应用ID") + app = AppCrud.get_app_by_id(body.app_id) + if not app: + raise HTTPException(status_code=202, detail="应用信息错误") + # 图片验证码校验 + check_res = ImageCaptchaVerify.check_code(body.captcha_id, body.captcha_code) + if not check_res: + raise HTTPException(status_code=202, detail="验证码过期或错误") + # 密码验证 + # 是否在前端传输时进行一次base64处理 + user_obj = get_user_by_email(db, body.email) + if user_obj is None: + raise HTTPException(status_code=404, detail="用户未注册") + encrypt_password = get_encrypt_password(body.password) + if encrypt_password != user_obj.password: + raise HTTPException(status_code=202, detail="密码错误") + if user_obj.disable: + raise HTTPException(status_code=202, detail="该账户被禁用") + + user_info = user_obj.as_info() + # 生成&加密token信息 + token = create_token({"id": user_obj.id}, app.token_key) + return UserSchemas.LoginResBody(**user_info, access_token=token, token_type='bearer', app_id=app.id) + + @router.post("/register", summary="注册") def register(body: UserSchemas.RegisterReqBody, db: Session = Depends(get_db)): # 用户是否存在 diff --git a/Router/UserRouter.py b/Router/UserRouter.py index 735d9c1..ca67f3f 100644 --- a/Router/UserRouter.py +++ b/Router/UserRouter.py @@ -28,7 +28,7 @@ def get_user_info(token_data: TokenData = Depends(token_data_depend), db: Sessio return user_info -@router.post('/avatar_upload') +@router.post('/avatar_upload',summary="用户头像上传") def avatar_upload(file: UploadFile = File(...), token_data: TokenData = Depends(token_data_depend)): if file.content_type not in ['image/png', 'image/jpeg']: raise Exception('图片格式应为png和jpg') diff --git a/Schemas/AppSchemas.py b/Schemas/AppSchemas.py index 8f6b394..1557e52 100644 --- a/Schemas/AppSchemas.py +++ b/Schemas/AppSchemas.py @@ -19,3 +19,24 @@ class UserBaseInfo(BaseModel): department: Union[str, None] post: Union[str, None] auth_data: Union[str, None] + + +from typing import List + +from pydantic import BaseModel + + +class AppAddInfo(BaseModel): + name: str + secret_key: str + + +class AppInfo(BaseModel): + id: str + name: str + secret_key: str + token_key: str + + +class AppInfoList(BaseModel): + app_info_list: List[AppInfo] diff --git a/Schemas/UserSchemas.py b/Schemas/UserSchemas.py index 9ac410f..433709c 100644 --- a/Schemas/UserSchemas.py +++ b/Schemas/UserSchemas.py @@ -15,6 +15,7 @@ class LoginReqBody(BaseModel): password: passwordRegex = "包含大小写字母和数字,长度8-16位" captcha_id: str captcha_code: str + app_id: Union[str, None] # class EmailSendReqBody(BaseModel): @@ -35,6 +36,7 @@ class UserInfo(BaseModel): class LoginResBody(UserInfo): access_token: str token_type: str + app_id: Union[str, None] # class RegisterReqBody(BaseModel): diff --git a/main.py b/main.py index a01a127..c86fd8c 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,8 @@ import uvicorn from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from Router import UserRouter, UserRegisterRouter, DepartmentRouter, PostRouter,AppRouter,UserManageRouter +from Router import UserRouter, UserRegisterRouter, DepartmentRouter, PostRouter, AppRouter, UserManageRouter, \ + AppManageRouter from Utils.ConfigUtils import init_common_config from Utils.RedisUtils import init_redis_pool from Utils.SqlAlchemyUtils import Base, init_database @@ -31,5 +32,6 @@ app.include_router(DepartmentRouter.router) app.include_router(PostRouter.router) app.include_router(AppRouter.router) app.include_router(UserManageRouter.router) +app.include_router(AppManageRouter.router) uvicorn.run(app=app, port=8001)