先看现象。用服务账号签发的 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,权限最小化之后审计也清楚。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
