baodan/api/insurance/auth/routes.py

172 lines
6.0 KiB
Python
Raw Normal View History

"""认证鉴权路由A1
POST /auth/register 用户注册
POST /auth/wework-login 企微登录
POST /auth/password-login 账密登录
2026-07-12 14:17:18 +08:00
POST /auth/send-email-code 发送注册邮箱验证码
POST /auth/forgot-password/send-code 发送找回密码验证码
POST /auth/reset-password 通过邮箱重置密码
POST /auth/refresh-token 刷新 Token
POST /auth/logout 退出登录
"""
from flask import Blueprint, request, jsonify
from insurance.auth.service import AuthService
from insurance.middleware.auth_middleware import jwt_required
auth_bp = Blueprint("auth", __name__)
auth_service = AuthService()
2026-07-12 14:17:18 +08:00
def _error_status(result: dict) -> int:
"""配置/服务端错误返回 500用户输入错误返回 400。"""
return 500 if result.get("code") == 5001 else 400
@auth_bp.route("/register", methods=["POST"])
def register():
"""用户注册。"""
data = request.get_json()
2026-07-12 14:17:18 +08:00
if not data:
return jsonify({"code": 1001, "message": "请求体不能为空", "data": None}), 400
username = data.get("username", "")
password = data.get("password", "")
2026-07-12 14:17:18 +08:00
email = data.get("email", "")
real_name = data.get("real_name", "")
code = data.get("code", "")
2026-07-12 14:17:18 +08:00
if not username or not password or not email or not real_name or not code:
return jsonify({"code": 1001, "message": "请输入用户名、密码、邮箱、真实姓名和验证码", "data": None}), 400
result = auth_service.register(username, password, email, real_name, code)
if result["code"] != 0:
return jsonify(result), _error_status(result)
return jsonify(result)
@auth_bp.route("/send-email-code", methods=["POST"])
def send_email_code():
"""发送注册邮箱验证码。"""
data = request.get_json()
if not data:
return jsonify({"code": 1001, "message": "请求体不能为空", "data": None}), 400
result = auth_service.send_email_code(
data.get("email", ""),
"register",
request.remote_addr or "",
)
if result["code"] != 0:
return jsonify(result), _error_status(result)
return jsonify(result)
@auth_bp.route("/forgot-password/send-code", methods=["POST"])
def forgot_password_send_code():
"""发送找回密码邮箱验证码。"""
data = request.get_json()
if not data:
return jsonify({"code": 1001, "message": "请求体不能为空", "data": None}), 400
result = auth_service.send_email_code(
data.get("email", ""),
"reset_password",
request.remote_addr or "",
)
if result["code"] != 0:
return jsonify(result), _error_status(result)
return jsonify(result)
@auth_bp.route("/reset-password", methods=["POST"])
def reset_password():
"""通过邮箱验证码重置密码。"""
data = request.get_json()
if not data:
return jsonify({"code": 1001, "message": "请求体不能为空", "data": None}), 400
email = data.get("email", "")
code = data.get("code", "")
new_password = data.get("new_password", "")
if not email or not code or not new_password:
return jsonify({"code": 1001, "message": "请输入邮箱、验证码和新密码", "data": None}), 400
2026-07-12 14:17:18 +08:00
result = auth_service.reset_password(email, code, new_password)
if result["code"] != 0:
2026-07-12 14:17:18 +08:00
return jsonify(result), _error_status(result)
return jsonify(result)
@auth_bp.route("/wework-login", methods=["POST"])
def wework_login():
"""企微登录:接收企微授权 code签发 JWT。"""
data = request.get_json()
2026-07-12 14:17:18 +08:00
if not data:
return jsonify({"code": 1001, "message": "请求体不能为空", "data": None}), 400
code = data.get("code", "")
state = data.get("state", "")
if not code:
return jsonify({"code": 1001, "message": "授权码无效", "data": None}), 400
result = auth_service.wework_login(code, state)
return jsonify(result)
@auth_bp.route("/password-login", methods=["POST"])
def password_login():
"""账密登录:校验用户名密码,返回 JWT。"""
data = request.get_json()
2026-07-12 14:17:18 +08:00
if not data:
return jsonify({"code": 1001, "message": "请求体不能为空", "data": None}), 400
username = data.get("username", "")
password = data.get("password", "")
if not username or not password:
return jsonify({"code": 1001, "message": "请输入用户名和密码", "data": None}), 400
result = auth_service.password_login(username, password)
if result["code"] != 0:
return jsonify(result), 401
return jsonify(result)
@auth_bp.route("/refresh-token", methods=["POST"])
@jwt_required
def refresh_token():
"""刷新过期 Token。"""
user_id = request.user_id
result = auth_service.refresh_token(user_id)
return jsonify(result)
@auth_bp.route("/logout", methods=["POST"])
@jwt_required
def logout():
"""吊销当前 Token。"""
token = request.headers.get("Authorization", "").replace("Bearer ", "")
user_id = request.user_id
result = auth_service.logout(token, user_id)
return jsonify(result)
@auth_bp.route("/change-password", methods=["POST"])
@jwt_required
def change_password():
"""修改密码。"""
data = request.get_json()
2026-07-12 14:17:18 +08:00
if not data:
return jsonify({"code": 1001, "message": "请求体不能为空", "data": None}), 400
old_password = data.get("old_password", "")
new_password = data.get("new_password", "")
if not old_password or not new_password:
return jsonify({"code": 1001, "message": "请输入旧密码和新密码", "data": None}), 400
# 密码强度校验8-128 位,至少包含字母和数字
if len(new_password) < 8 or len(new_password) > 128:
return jsonify({"code": 1001, "message": "密码长度需在 8-128 之间", "data": None}), 400
if not any(c.isalpha() for c in new_password) or not any(c.isdigit() for c in new_password):
return jsonify({"code": 1001, "message": "密码需包含字母和数字", "data": None}), 400
user_id = request.user_id
result = auth_service.change_password(user_id, old_password, new_password)
return jsonify(result)