GPTMap

OpenAI API key 过期策略详解:expires_in_seconds、组织级 policy 与自动化密钥治理

Service Account API key 的过期语义在 v3.11.0 / v7.13.0 里完成了关键升级:key 默认不过期的时代结束了——组织或项目级过期策略可以强制要求过期,最大生命周期内必须显式传值。参数边界、代码示例与运维清单一次讲清。

TL;DR
openai-python v3.11.0 与 openai-node v7.13.0(2026-09-09 15:30 UTC 发布)给 Service Account API key 的过期语义加了组织级约束:expires_in_seconds 取值范围 1 到 31536000 秒(365 天);不传或传 null 时 key 不过期——除非组织或项目级 policy 要求过期;policy 设了最大生命周期时必须传值且不得超过;create_service_account_only 为 true 时禁止传非 null 值。响应侧 expires_at(Unix 时间戳,可 null)落进 project API key 与 service account 创建响应两类对象。截至 2026-09-10 核对,policy 本身的查询端点未出现在 SDK 类型里。
OpenAI API key 过期策略是 2026-09-09 起 Service Account API key 的过期语义:创建服务账号时可用 expires_in_seconds(1 到 31536000 秒)给初始 key 设寿命;组织或项目级 policy 可要求 key 必须过期并可设最大生命周期,此时不传值会遵循 policy,超过上限的值会被拒绝。

操作步骤

  1. 升级 SDK 到带 policy 语义的版本

    Python 升到 openai>=3.11.0,Node 升到 openai(openai-node)>=7.13.0。过期基础字段自 v3.10.0 / v7.11.0 起可用,policy 约束语义自 v3.11.0 / v7.13.0 起生效。

  2. 创建服务账号时传 expires_in_seconds

    调用 admin.organization.projects.serviceAccounts.create(或对应客户端方法),传 name 与 expires_in_seconds(1 到 31536000 之间的整数秒)。若组织或项目已设最大生命周期 policy,传值不得超过该上限。

  3. 从响应读取 expires_at 并记录

    响应对象的 expires_at 是 Unix 时间戳(秒),null 表示不过期。把它写进密钥台账,到期前安排轮换。

  4. 对不落地的值做错误处理

    传 0 或负数、超过 31536000、超过 policy 上限、或与 create_service_account_only=true 同用时,请求会被 schema 校验拒绝——捕获 400 并提示调用方调整参数。

Service Account API key 的过期语义,在 2026-09-09 这一天完成了从"可选字段"到"策略治理"的升级。openai-python v3.11.0 与 openai-node v7.13.0(均于当日 15:30 UTC 前后发布,release notes 标题分别为 "Add expiration controls for service account keys" / "Add API key expiration controls")给 expires_in_seconds 加上了硬边界和组织级 policy 约束——"key 永不过期"从此不再是默认的最终状态,而是"还没有 policy 要求你过期"的临时状态。

本文事实全部来自 2026-09-10 当日重抓的两包 release notes、PR diff 与 v3.11.0 tag 源码(引用清单见文末);OpenAI 官方文档域当日对本站 403,涉及管理界面操作路径的表述一律不做超出类型层证据的断言。

1. 概述:这次升级改了什么

OpenAI API key 过期策略指 2026-09-09 起 Service Account API key 的过期语义:创建服务账号时可用 expires_in_seconds(1 到 31536000 秒)给初始 key 设寿命;组织或项目级 policy 可要求 key 必须过期并可设最大生命周期。

时间线分两步,容易混淆:

版本发布时间(UTC)带来的能力
openai-python v3.10.0 / openai-node v7.11.02026-09-08 / 09-08基础过期字段:expires_in_seconds(请求)+ expires_in_seconds / expires_at(响应)
openai-python v3.11.0 / openai-node v7.13.02026-09-09 15:30policy 约束语义:组织/项目级过期策略可以强制 key 过期;参数加上下限校验(1..31536000);create_service_account_only 互斥约束

第一步是"你能传这个字段",第二步是"你的组织可以强制你传、并限制你传多大"。两包版本号不一一对应,这是 OpenAI 双 SDK 的常态。

2. expires_in_seconds 的完整语义

v3.11.0 的 ServiceAccountCreateParams(src/openai/types/admin/organization/projects/service_account_create_params.py)里,这个参数的 docstring 值得整段读:

Number of seconds until the initial API key expires. If omitted or null, the key does not expire unless the effective organization or project policy requires an expiration. When a policy sets a maximum lifetime, this value must be provided and must not exceed that limit. A non-null value cannot be used when create_service_account_only is true.

拆成四条规则:

  1. 显式传值:初始 key 在 expires_in_seconds 秒后过期,取值 1 到 31536000(365 天)——schema 硬校验(minimum: 1 / maximum: 31536000),超出直接被拒。
  2. 不传或 null:key 不过期——但仅当没有生效的组织/项目级 policy 要求过期。policy 存在时,即使你不传,key 也会按 policy 过期。
  3. policy 设了最大生命周期:此时 expires_in_seconds 从可选项变成必填项,且值不得超过 policy 上限。
  4. 与 create_service_account_only 互斥:create_service_account_only: true 表示创建不带初始 key 的服务账号——没有初始 key,自然没有"初始 key 的过期时间"可设,此时传非 null 值会被拒绝。

一句话总结:policy 是新的最高优先级。你的代码传不传值,都要先回答"我的组织有没有设 policy、上限是多少"。

3. 组织/项目级 policy:SDK 类型层能确认与不能确认的

能确认的(类型层有证据):policy 的效果——它能让"不传值"的 key 过期、能给 expires_in_seconds 设上限、能把可选项变成必填。

不能确认的(类型层无证据,截至 2026-09-10 核对):policy 的管理端点。两包 SDK 里没有创建、查询、修改 policy 的资源与方法。按现有证据,policy 通过 OpenAI 管理界面设置;SDK 类型里没有相反证据,也没有佐证它有 API。等它的端点出现在类型层,本站会跟进。

对多团队组织这是个典型的平台治理信号:安全团队可以在组织层面强制"所有 service account key 最长活 N 天",业务代码不改一行就自动被约束——传了超限值会被拒,不传值会按 policy 过期。

4. 代码示例

4.1 创建带过期时间的 Service Account(Python)

from openai import OpenAI

client = OpenAI()

sa = client.admin.organization.projects.service_accounts.create(
    project_id="prj_xxx",              # 占位示例
    name="ci-runner",
    expires_in_seconds=60 * 60 * 24 * 90,   # 90 天(7776000 秒,合法区间 1..31536000)
)
print(sa.expires_at)   # Unix 时间戳(秒);null 表示不过期

4.2 同一操作的 Node 版本

import OpenAI from 'openai';

const client = new OpenAI();

const sa = await client.admin.organization.projects.serviceAccounts.create({
  project_id: 'prj_xxx',        // 占位示例
  name: 'ci-runner',
  expires_in_seconds: 60 * 60 * 24 * 90,
});
console.log(sa.expires_at);     // Unix timestamp (seconds); null = never expires

4.3 审计存量 key 的过期时间(Python)

keys = client.admin.organization.projects.api_keys.list(project_id="prj_xxx")
for k in keys.data:
    print(k.id, k.expires_at)   # v3.11.0 起 project API key 对象携带 expires_at

三段代码均为 SDK 源码核对版(对照 v3.11.0 类型定义逐字段核对),未在真实 key 下实跑;project_id 等占位值替换成你自己的资源 ID。

5. 运维清单:把 policy 语义用起来

  • CI / 自动化场景:key 寿命与部署节奏对齐——流水线用的 key 传 30 天(2592000 秒),配合轮换日历;不要用 365 天上限去偷懒,365 天是上限不是目标。
  • 密钥台账:把每个 key 的 expires_at 记进台账并监控到期时间。expires_at 为 null 的存量 key 在组织设 policy 之前不会自动过期——policy 落地后它们的行为会变,先盘点再等政策。
  • 错误处理:传 0、负数、超过 31536000、超过 policy 上限、与 create_service_account_only=true 组合,都会被 schema 校验拒绝。捕获 400 类错误并把原因传给调用方,别让它变成深夜告警。
  • 升级顺序:先升 SDK(Python ≥ v3.11.0 / Node ≥ v7.13.0)再动 key 策略——老版本类型里没有 policy 约束语义,校验错误信息会对不上。

6. 常见错误与排查

  • 传 0 或负数:schema minimum: 1,直接被拒。要"立刻过期"不在这个参数的能力范围里——它是创建时设定,不是撤销工具。
  • 超过 31536000:365 天是硬上限。"两年后再过期"的请求会被拒,分期轮换是正解。
  • 与 create_service_account_only 同用:互斥。创建无初始 key 的服务账号时不传 expires_in_seconds。
  • 误以为这是用户 key 的功能:截至 2026-09-10 核对,过期字段只在 Service Account 与 project API key 对象上;用户 API key 的类型层没有对应变化。
  • policy 上限报错对不上文档:policy 上限是组织自设的,SDK 类型里看不到具体值,报错信息里的上限以你的组织配置为准——这也是"必须能在报错里读懂 policy"的原因。

7. 下一步

关键要点

  • expires_in_seconds 合法区间:1 到 31536000 秒(365 天),schema 硬校验,2026-09-09 起(openai-python v3.11.0 / openai-node v7.13.0)
  • 默认语义变了:不传或 null = 不过期——但仅当没有任何组织/项目级 policy 要求过期;policy 存在时 key 会按 policy 过期
  • policy 设了最大生命周期(maximum lifetime)时:必须显式传 expires_in_seconds,且不得超过 policy 上限
  • create_service_account_only 为 true(创建不带初始 key 的服务账号)时,expires_in_seconds 不能传非 null 值
  • 响应侧:project API key 对象与 service account 创建响应都带 expires_at(Unix 时间戳,秒,永不过期为 null)
  • 截至 2026-09-10 核对:policy 的创建/查询端点未出现在两包 SDK 类型里——policy 只能通过管理界面设置(SDK 类型层没有相反证据,也没有佐证)

常见问题

31536000 秒,即 365 天。这是 v3.11.0 起 OpenAPI schema 里的硬校验(minimum: 1, maximum: 31536000),超过会被拒绝,不是文档建议值。

官方参考

相关文章

订阅 GPTMap Weekly

每周一封邮件,精选 OpenAI 重要更新、深度解读与最佳实践。无广告,可随时退订。

提交后将在新标签页打开 Buttondown 完成订阅确认。

GPTMap Editorial发布于 2026-09-10 9 分钟阅读
测试环境(EEAT)
最后测试时间:2026-09-10
使用模型:gpt-5.6(当前旗舰家族;Admin API key 治理与具体模型版本无关)