@crvouga/ mockingbird-service-app-shore-connect 互联网档案馆的存檔,存档日期2013-12-02
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
WIP App Store 连接模拟器,用于 JSON: API 应用程序,用户,用户邀请,β组和 β测试器. ES256签名实际上是被验证的;没有真正的苹果账户或电子邮件.
安装
bun add -d @crvouga/mockingbird-service-app-store-connect
使用量
import { SignJWT } from "jose"
import { createServer } from "@crvouga/mockingbird-service-app-store-connect/server"
// Test setup: a throwaway ES256 key pair. The emulator only gets the public half.
// Never use a real Apple private key here.
const pair = await crypto.subtle.generateKey(
{ name: "ECDSA", namedCurve: "P-256" }, true, ["sign", "verify"],
)
const server = await createServer({
keys: [{ id: "mock-key", issuer: "mock-issuer", role: "ADMIN",
publicKey: await crypto.subtle.exportKey("jwk", pair.publicKey) }],
})
// Apple publishes no JavaScript SDK, so the application signs its team JWT and calls the API
// over HTTP. Only the origin changes: server.url instead of api.appstoreconnect.apple.com.
const token = await new SignJWT({})
.setProtectedHeader({ alg: "ES256", kid: "mock-key", typ: "JWT" })
.setIssuer("mock-issuer")
.setAudience("appstoreconnect-v1")
.setIssuedAt()
.setExpirationTime("10m")
.sign(pair.privateKey)
const apps = await fetch(`${server.url}/v1/apps`, { headers: { authorization: `Bearer ${token}` } })
const { data } = (await apps.json()) as { data: { attributes: { name: string } }[] }
console.log(data[0]?.attributes.name) // Synthetic App
await server.close()
createRuntime().fetch(Request) 支持进程内客户端。 CLI 不可信地开始
密钥; 种子公开校验密钥通过 /__admin/state/keys,或者使用服务器选项.
没有静态绕行无记名标志。 模拟者从来不需要私人签名材料;
包含私人 JWK 选项被拒绝。 在测试启动时生成测试签名密钥 .
认证
JWT队需要ES256, typ: JWT已登记 kid,匹配发行者和 appstoreconnect-v1
对象,有效 iat编号 :exp,签名验证和最长20分钟的寿命.
模拟器时钟决定了过期 . enabled: false 取消种子密钥。 可选范围
请求限制 GET 路径/ query 参数; 限制/ coursor/ sort 在匹配时被忽略为
由苹果公司记录。 无效的认证返回 JSON:API 401 在突变前.
范围写作政策遵循了苹果的团队/TestFlight指南:ADMIN/ACCOUNT HOLDER 可能写入所有支持的表面; APP MANAGER 可能管理β组/测试器并创建 用户邀请。 其他种子角色以403被否定写作. 阅读授权和 应用特定角色限制简化;见下文限制.
路线
- 获取
/v1/apps, (中文(简体) ),/v1/users, (中文(简体) ),/v1/userInvitations, (中文(简体) ),/v1/betaGroups, (中文(简体) ),/v1/betaTesters。 。 。 . - 邮政
/v1/userInvitations, (中文(简体) ),/v1/betaGroups, (中文(简体) ),/v1/betaTesters。 。 。 . - 获取
/v1/betaGroups/{id}/betaTesters。 。 。 . - 邮政/电子邮件
/v1/betaGroups/{id}/relationships/betaTesters。 。 。 . - 邮政
/v1/users/{id}/relationships/visibleApps。 。 。 . - 迪莱特
/v1/users/{id}财务报告和审定财务报表/v1/userInvitations/{id}。 。 。 .
列表支持限制/ 曲线, 稀有 fields[type],名称/电子邮件过滤器和请求
用于组/测试者的应用过滤器. links.next 保留在配置的本地来源上并保留
公共名称空间。 关系书写在改变任何东西之前验证每个目标;
删除测试者成员不删除测试者、组或应用程序用户.
复制测试器/邀请电子邮件返回一个409 JSON:API错误,也可以被错误注入.
控件
种子 resources 作为JSON:API记录和 keys 用作公共核查钥匙。 种子组/酯
和用户/可见的App关系初始化可持久边缘集合. /__admin/state
曝光情况 resources, (中文(简体) ), keys, (中文(简体) ), memberships, (中文(简体) ), visibleApps 用于合成装置.
标准重置,有时光线快照/快取,时钟,请求日记和断层.
请求使用页眉, /__admin/ns/<name>/… 路径或绘图的无记名证书命名空间;
adminPrefix 移动保留树。 期刊没有JWT或请求机构.
预设 : unauthorized, (中文(简体) ), forbidden, (中文(简体) ), duplicate, (中文(简体) ), rate_limited, (中文(简体) ), server_error, (中文(简体) ),
connection_drop;通用断层也支持确定性延迟. 没有释放出网络用户 .
核查
bun test 通过原始获取、实际签名、使用
独立生成 jose ES256 键, JWT 拒绝/撤销, 范围写入,种子边缘,
服务 HTTP, 命名空间/ 重置/ 错误控制, OpenAPI 随机行走和故意的相差 .
消费者是该期报道的"地表"的港口,并非没有私人应用代码.
没有要求官方 SDK 。 没有使用实时账户证书或写作.
APP_STORE_CONNECT_TOKEN=… bun run parity 安全地探测出单一的应用程序列表响应形状;
缺少证书出口 2。 这不是一个完全的供应商随机行走平等主张.
合同来源:苹果公司 官方 OpenAPI 下载, (中文(简体) ), JWT指南, (中文(简体) ), 团队指南, (中文(简体) ), 财务报告和审定财务报表 外部测试器指南。 。 。 . 请求计划从已公布的 OpenAPI 中保留;响应字段是一个范围子集.
故意不模拟
二进制上传,App Store发布,真实邀请电子邮件,构建,设备安装, TestFlight审查先决条件和用户接受邀请. 个人钥匙 不相干的Apple API的长生代号在这个团队键表面之外. 不错 读取权限,每个应用程序密钥访问,高级角色分配限制,关系 扩大/纳入和生产重复诊断变体得不到保证. 管理固定编辑可以构建活的API禁止的状态;种子一致的记录.
API 密码
根运行时间导出 : AppStoreConnectAPI, (中文(简体) ), APP_STORE_CONNECT_NAMESPACE, (中文(简体) ), DEFAULT_RESOURCES, (中文(简体) ),
createRuntime, (中文(简体) ), APP_STORE_CONNECT_PRESETS, (中文(简体) ), document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds。 。 。 .
类型 : ApiKey, (中文(简体) ), ResourceType, (中文(简体) ), Linkage, (中文(简体) ), Resource, (中文(简体) ), AppStoreConnectAPIOptions, (中文(简体) ),
AppStoreConnectRuntimeOptions, (中文(简体) ), AppStoreConnectRuntime, (中文(简体) ), OperationId, (中文(简体) ), SupportedOperationId。 。 。 .
这个 /server 进口 createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT。 。 。 .