先看现象。用服务账号签发的 key 调组织级接口一律 403,换成同事的用户 key 就能通,服务账号在成员列表里挂的也是管理角色。

排查方向其实有限,先把可能性排一排。服务账号绑定在项目上,只能访问该项目下的资源。另一种情况是组织级账单与用量接口要求用户身份的 key。

少数情况下是服务账号拿到的是项目角色,不参与组织角色体系。

不容易想到的是,建 key 时勾了受限权限集,读写范围被进一步裁剪。

动手时先看这个 key 对应的身份与范围

curl -s https://api.openai.com/v1/me -H "Authorization: Bearer $OPENAI_API_KEY" | jq '.id'

随后改用项目维度参数调用量接口

curl -s "https://api.openai.com/v1/organization/usage/completions?start_time=$(date -d '-1 day' +%s)&project_ids=proj_abc" -H "Authorization: Bearer $SA_KEY" | jq '.data|length'

接着确认服务账号能读本项目模型列表

curl -s https://api.openai.com/v1/models -H "Authorization: Bearer $SA_KEY" | jq '.data|length'

需要组织数据时换用户 key 再请求

curl -s https://api.openai.com/v1/organization/projects -H "Authorization: Bearer $OWNER_KEY" | jq '.data|length'

改完先别撤,确认这几项。项目维度接口返回 200 且 results 非空,组织级请求改用用户 key 后同样 200,监控脚本不再出现 403。

服务账号适合跑业务调用,不适合做财务对账,把两类用途拆成两把 key,权限最小化之后审计也清楚。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189