2026-09-08 19:55:08 +08:00
|
|
|
"""开发期 Mock 登录:签发 JWT(与模块 auth_service 同一 issuer/audience)。"""
|
2026-09-07 17:20:42 +08:00
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from fastapi import APIRouter, Request
|
|
|
|
|
|
2026-09-08 19:55:08 +08:00
|
|
|
from app.config.settings import settings
|
|
|
|
|
from app.gateway.jwt_service import infer_roles, permissions_for_roles
|
2026-09-07 17:20:42 +08:00
|
|
|
from app.model.schemas import LoginRequest, LoginResponseData
|
2026-09-08 19:55:08 +08:00
|
|
|
from app.service.auth_service import issue_dev_token
|
2026-09-07 17:20:42 +08:00
|
|
|
from app.utils.response import ok
|
|
|
|
|
|
|
|
|
|
router = APIRouter(prefix="/api/auth", tags=["auth"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/login")
|
|
|
|
|
def login(body: LoginRequest, request: Request):
|
|
|
|
|
roles = infer_roles(body.actor_id, body.token_type, body.roles)
|
2026-09-08 19:55:08 +08:00
|
|
|
if not roles:
|
|
|
|
|
from app.utils.exceptions import UnauthorizedError
|
|
|
|
|
|
|
|
|
|
raise UnauthorizedError("未知账号,无法签发 token", error_code="AUTH_401_UNKNOWN_ACTOR")
|
|
|
|
|
|
|
|
|
|
permissions = permissions_for_roles(roles)
|
|
|
|
|
customer_id = body.actor_id if body.token_type == "customer" else None
|
|
|
|
|
advisor_id = body.actor_id if body.token_type == "staff" and "advisor" in roles else None
|
|
|
|
|
token = issue_dev_token(
|
|
|
|
|
sub=body.actor_id,
|
|
|
|
|
roles=roles,
|
|
|
|
|
token_type=body.token_type,
|
|
|
|
|
exp_minutes=settings.jwt_dev_expire_hours * 60,
|
|
|
|
|
tenant_id="TENANT-001",
|
|
|
|
|
customer_id=customer_id,
|
|
|
|
|
advisor_id=advisor_id,
|
|
|
|
|
permissions=permissions,
|
|
|
|
|
)
|
2026-09-07 17:20:42 +08:00
|
|
|
trace_id = getattr(request.state, "trace_id", "unknown")
|
|
|
|
|
data = LoginResponseData(
|
|
|
|
|
access_token=token,
|
2026-09-08 19:55:08 +08:00
|
|
|
expires_in=settings.jwt_dev_expire_hours * 3600,
|
2026-09-07 17:20:42 +08:00
|
|
|
sub=body.actor_id,
|
|
|
|
|
roles=roles,
|
|
|
|
|
)
|
|
|
|
|
return ok(data.model_dump(), trace_id, message="login ok")
|