SuperAPI AI 工具集

adding-project-secret-api-key-auth

编程与开发

查看项目

更新于 10-16 09:51

技能介绍

用途:说明如何用项目密钥 API Key(PSAK)保护 PostHog API 端点。PSAK 是项目级、无用户的服务凭据(posthog/models/project_secret_api_key.py),行为类似个人 API Key,但用户离开项目后仍有效,带独立作用域,并以合成用户身份认证,而非真实 User 行。

主要能力:令牌格式 phs_,仅支持 Bearer 头,无 body 回退;作用域在资源类型内为项目级,刻意忽略对象级 RBAC;密钥在 POST /api/environments/:id/project_secret_api_keys 管理(label + scopes,明文值仅返回一次;roll 旋转;每项目最多 50 个;不允许通配符 * 作用域)。不要与 TeamSecretTokenAuthentication 混淆,后者验证旧版 Team.secret_api_token,仅用于功能开关本地评估等旧接口。

用法:接入 viewset 需四步。一是在 posthog/scopes.py 的 PROJECT_SECRET_API_KEY_ALLOWED_API_SCOPE_ACTION 白名单中加入 (scope_object, action),否则创建密钥时即被拒。二是在视图集中设置 scope_object,加入 ProjectSecretAPIKeyAuthentication 并在 psak_allowed_actions 列出允许的动作(默认拒绝,未列出的动作返回 403)。三是使用 PSAK 感知的限流:PersonalOrProjectSecretApiKeyRateThrottle 与 ProjectSecretApiKeyTeamRateThrottle,前者按密钥、后者按团队聚合。四是处理合成用户 request.user:user.id 为 None,禁止用作外键,改用 user.current_team_id;has_perm() 恒为 False;需跳过对象级访问检查。可用 posthog/permissions.py 中的 is_authenticated_via_project_secret_api_key(request) 与 is_service_auth(request) 分支。

适用场景:为 endpoints 等产品提供程序化服务访问,仅限项目级路由(/api/environments/:id/...),因 APIScopePermission 会自动强制 team 绑定。调用示例:curl 加 -H "Authorization: Bearer phs_<key>"。自带查询标记、last_used_at 跟踪(至多每小时)与密钥操作活动日志。测试需覆盖:正确作用域动作返回 200、动作未列出返回 403、缺失/错误作用域返回 403、他团队密钥返回 403、同动作非 PSAK 认证仍可用。限制:机器尚未接入任何消费者;PSAK 作用域全项目级,不遵循对象级 RBAC;报告的用户行为会丢弃合成用户,需显式捕获。