增加应用授权登录与应用管理

This commit is contained in:
wcq 2023-02-08 16:26:25 +08:00
parent 51950eca7a
commit de9fe42539
6 changed files with 59 additions and 4 deletions

View File

@ -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)): def get_user_base_info(payload=Depends(app_auth_token_depend)):
return AppSchemas.UserBaseInfo(**payload) return AppSchemas.UserBaseInfo(**payload)
# 用户授权登录

View File

@ -4,8 +4,9 @@ from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from Crud.UserCrud import get_user_by_email, create_user, rest_user_password from Crud.UserCrud import get_user_by_email, create_user, rest_user_password
from Crud import AppCrud
from Schemas import UserSchemas 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.EncyptUtil import get_encrypt_password
from Utils.SqlAlchemyUtils import get_db from Utils.SqlAlchemyUtils import get_db
from Utils.VerifyCodeUtils import EmailVerifyCode, ImageCaptchaVerify, EmailVerifyType 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') 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="注册") @router.post("/register", summary="注册")
def register(body: UserSchemas.RegisterReqBody, db: Session = Depends(get_db)): def register(body: UserSchemas.RegisterReqBody, db: Session = Depends(get_db)):
# 用户是否存在 # 用户是否存在

View File

@ -28,7 +28,7 @@ def get_user_info(token_data: TokenData = Depends(token_data_depend), db: Sessio
return user_info 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)): def avatar_upload(file: UploadFile = File(...), token_data: TokenData = Depends(token_data_depend)):
if file.content_type not in ['image/png', 'image/jpeg']: if file.content_type not in ['image/png', 'image/jpeg']:
raise Exception('图片格式应为png和jpg') raise Exception('图片格式应为png和jpg')

View File

@ -19,3 +19,24 @@ class UserBaseInfo(BaseModel):
department: Union[str, None] department: Union[str, None]
post: Union[str, None] post: Union[str, None]
auth_data: 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]

View File

@ -15,6 +15,7 @@ class LoginReqBody(BaseModel):
password: passwordRegex = "包含大小写字母和数字长度8-16位" password: passwordRegex = "包含大小写字母和数字长度8-16位"
captcha_id: str captcha_id: str
captcha_code: str captcha_code: str
app_id: Union[str, None] #
class EmailSendReqBody(BaseModel): class EmailSendReqBody(BaseModel):
@ -35,6 +36,7 @@ class UserInfo(BaseModel):
class LoginResBody(UserInfo): class LoginResBody(UserInfo):
access_token: str access_token: str
token_type: str token_type: str
app_id: Union[str, None] #
class RegisterReqBody(BaseModel): class RegisterReqBody(BaseModel):

View File

@ -1,7 +1,8 @@
import uvicorn import uvicorn
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware 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.ConfigUtils import init_common_config
from Utils.RedisUtils import init_redis_pool from Utils.RedisUtils import init_redis_pool
from Utils.SqlAlchemyUtils import Base, init_database from Utils.SqlAlchemyUtils import Base, init_database
@ -31,5 +32,6 @@ app.include_router(DepartmentRouter.router)
app.include_router(PostRouter.router) app.include_router(PostRouter.router)
app.include_router(AppRouter.router) app.include_router(AppRouter.router)
app.include_router(UserManageRouter.router) app.include_router(UserManageRouter.router)
app.include_router(AppManageRouter.router)
uvicorn.run(app=app, port=8001) uvicorn.run(app=app, port=8001)