IWish Auth开发者文档
V1 Alpha GitHub

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 提供 logincallbacklogoutget_sessionrequire_authrequire_app_accessrequire_organizationget_client_assignments。Client 提供 get_app_sessionget_identityget_employee_contextget_client_assignmentsrevoke_app_session

require_permissioncheck_permissioncheck_permissions_batchcheck_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 或项目范围。