服务对象与地域限制
PuppyIP 仅面向海外合规企业及其授权人员提供服务,不面向中国大陆地区开放或提供代理服务。本服务仅限用于中国大陆境外的合法业务活动,严禁在中国大陆境内使用本服务。
代理 IP 或服务器位于境外,不改变上述限制。不得通过中转、转接、共享或转售向中国大陆境内的最终使用者提供本服务。使用前请阅读用户服务协议。
本文要点
- AWS 于 2026-11-12 宣布 OAuth 2.0 令牌交换,适用于 Essentials 或 Plus 用户池;开发者指南还要求账户已开通该功能。
- 省略 actor token 是模拟用户直接操作;传入 actor token 才是带 act 身份声明的委托。
- 明确请求的 scope 取请求、原令牌和客户端许可的交集;API 文档说明,省略 Scopes 会保留原令牌的 scope。
- GetDerivedToken 的 Audiences 与 Resources 不能同次传入;交换不产生刷新令牌,也不能延长原凭据的寿命。
先核对资格,不把发布公告当作账户已开通
AWS 于 2026 年 11 月 12 日宣布 Cognito 用户池支持 OAuth 2.0 Token Exchange(令牌交换):服务收到用户请求后,可换取适合下游服务的令牌,避免直接转发权限过宽的原令牌。公告覆盖提供 Cognito 的全部 AWS 区域,但功能限 Essentials 或 Plus 套餐。
开发者指南还列出账户已启用该功能这一前提。公告中的区域范围不等于每个账户、用户池或副本区域都能立即调用;OperationNotEnabledException 应结合账户开通、用户池配置和目标区域逐项核实。
当前定价页区分用户池套餐的月活跃用户计费和其他附加项目,未提供本文可确认的令牌交换专属数值报价。不要把它写成免费,也不要套用 client credentials 的 M2M 令牌单价;按自己的地区、登录方式和实际套餐核算。
需要识别代办服务,就选择 delegation
subject token 表示被代办的用户;actor token 表示实际发起下游操作的中间服务。不带 actor token 时是 impersonation(模拟用户身份),签发令牌没有 act 声明,下游无法据此区分用户直接操作与中间服务代办。
携带 ActorToken 和 ActorTokenType 时是 delegation(委托),act 声明记录中间服务的身份。客户端的 ExplicitAuthFlows 必须启用对应的 ALLOW_TOKEN_EXCHANGE_DELEGATION;模拟身份则对应 ALLOW_TOKEN_EXCHANGE_IMPERSONATION,也可按需求启用两者。
act 包含身份信息,下游仍需校验令牌并执行自己的授权策略。它不是“这个代理可以做所有事情”的许可,也不会因为请求来自 AI 工具就自动出现。
省略 Scopes,不会自动缩小权限
GetDerivedToken 的 Scopes 字段明确说明:指定 scope 后,返回权限是请求范围、SubjectToken 原有范围与请求客户端允许范围的交集。令牌交换不能添加原令牌没有的 scope。
例如,假设原令牌有 orders/read 和 orders/write,而下游只需查询订单,就明确请求 orders/read,并检查响应 Scopes 和签发令牌。此例只解释权限选择,没有实际调用用户池。
API 文档特别说明,不指定 Scopes 时会签发与 SubjectToken 相同 scope 的令牌。因此,“已经交换”不代表“已经最小化权限”;请求前先列出必要操作,返回后再核对实际授权。
Audiences 和 Resources 只能选一种
audience 表示令牌面向的目标服务,resource 表示用户池中的资源服务器。操作指南有概括性描述,具体请求应遵循 GetDerivedToken API:Audiences 与 Resources 互斥,每个数组最多一个值。不要在同一请求中把两者一起填入。
目标值需要对应用户池中已登记的资源服务器。交换后的令牌仍须由下游按其签名、目标和权限要求验证;仅解码看到某个字段,不足以证明请求已获授权。
OAuth 和 SDK 的参数形式不同
使用用户池域名的 /oauth2/token 时,发送 application/x-www-form-urlencoded 的 POST,grant_type 使用 urn:ietf:params:oauth:grant-type:token-exchange,令牌类型参数采用 RFC 的 URN 写法。按官方文档使用客户端认证,委托还需 actor_token 与 actor_token_type。
通过 AWS SDK 调用 GetDerivedToken 不要求用户池域名。必填字段包括 ClientId、SubjectToken、SubjectTokenType;保密客户端还应提供 ClientSecret。SDK 的 SubjectTokenType 使用 ACCESS_TOKEN、ID_TOKEN 或 SAML2 枚举,不要把 OAuth 的完整 URN 原样放进这个字段。
两种入口的字段名和编码方式不同,选择一种后按其当前契约填写。本文没有发送令牌请求或使用真实凭据;接入前应在已授权的测试环境确认客户端与身份提供商配置。
检查实际到期时间与错误类型
令牌交换不返回 refresh token(刷新令牌),新令牌也不能活得比原凭据更久。检查 GetDerivedToken 响应的 ExpiresIn 秒数,不要把文档示例的 3600 当成所有交换固定一小时。缓存和重新获取流程需要考虑原凭据的剩余有效期。
遇到失败先保留脱敏的错误类型并定位阶段。API 将参数问题列为 InvalidParameterException,未获授权列为 NotAuthorizedException;ForbiddenException 描述用户池关联 AWS WAF 的阻止,文档列出的 HTTP 状态是 400。不能只按异常名称猜成 403,或一律归因于网络出口。
资料来源
常见问题
可以直接交换外部 OIDC 或 SAML 用户的令牌吗?
可以接受已在用户池登记的 OIDC 或 SAML 2.0 身份提供商令牌,但须给出相应 provider name,subject 或 actor 也必须已是关联用户。交换不会创建新用户;输出只支持 access token 或 ID token,不能签发 SAML 断言。
这是 client credentials 的机器对机器授权吗?
不是。令牌交换派生的是代表用户的下游令牌;client credentials 的 M2M 授权代表应用自身。先确定调用代表谁,再选择流程,不能因两者都由服务器发请求就混用资格、权限或计费口径。