FastAPI
使用 Python SDK 和依赖注入接入
FastAPI 接入
Python SDK 0.3 与 TypeScript 使用同一 App Session 契约。FastAPI Adapter 负责统一登录、callback、HttpOnly Cookie、session introspection 和登出;业务角色与权限依赖由业务 App 自己实现。
from fastapi import Depends, FastAPI, HTTPException, Request
from iwish_auth.fastapi import IWishFastAPIAuth, IWishFastAPIAuthOptions
app = FastAPI()
auth = IWishFastAPIAuth(IWishFastAPIAuthOptions(
api_url=IWISH_AUTH_API_URL,
portal_url=IWISH_AUTH_PORTAL_URL,
app_key="reporting",
client_id=IWISH_AUTH_CLIENT_ID,
client_secret=IWISH_AUTH_CLIENT_SECRET,
redirect_uri="https://reporting-staging.example.com/auth/callback",
))
@app.get("/api/reports")
async def reports(request: Request, session=Depends(auth.require_app_access)):
member = await local_members.find_by_auth_user_id(session["user"]["id"])
if not member or member.status != "active":
raise HTTPException(status_code=403, detail="local_member_required")
if not await local_permissions.has(member.id, "report.read"):
raise HTTPException(status_code=403, detail="local_permission_denied")
return {"reports": await load_reports(member), "clientAssignments": session["clientAssignments"]}
Adapter 提供 login、callback、logout、get_session、require_auth、require_app_access、require_organization 和 get_client_assignments。Client 提供 get_app_session、get_identity、get_employee_context、get_client_assignments 和 revoke_app_session。
旧 require_permission、check_permission、check_permissions_batch 和 check_user_permission 会返回 410 application_owned_authorization。它们仅用于阻止旧接入静默继续,不得作为生产授权路径。
本地成员表使用 iwish_auth_user_id 唯一关联 session["user"]["id"]。无成员、停用或本地角色不足默认 403。clientAssignments 只能参与业务筛选;assignment 存在不能绕过本地权限,assignment 为空也不能自动允许所有客户。内部员工飞书离职后 Auth session 必须失败,即使本地成员仍为 active。
生产环境必须使用 HTTPS、精确 callback、Secure Cookie 和服务端 Secret 管理。不要直接调用飞书或 Supabase Auth,不要信任来自浏览器的用户 ID、角色 Header 或项目范围。