@crvouga/mockingbird-service-persona

中文文档
3.11.0发布于 2026/11/11MITTypeScriptES Module构建来源已验证近 30 天下载 2912

Persona身份验证API的状态仿真器:查询创建,列表(可重复使用查询),获取,主机流程页面,管理生命周期过渡,Persona-Signature webhoks.

中文使用文档
文档目录9 节
  1. 安装
  2. 使用量
  3. 路线
  4. 生命周期和网点
  5. 管理员(超过标准合同)
  6. 命名空间
  7. 我们的消费者用它做什么(差异)
  8. 故意不模拟
  9. API 密码

@crvouga/ 嘲笑鸟 - 服务 - 人

本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .

状态模拟器 个人a测试套房的身份验证API:创建查询, 查找“ 可重复使用的查询” 列表, 获取一个查询, 主机流程页成员被发送 改为和 Persona-Signature- 签署事件 Persona回帖。 问询只在 测试是这样说的(管理动作或点击主机页面),所以Rx咨询的ID 核查步骤(旗帜) rx-id-verification)运行时没有真正的沙盒或真正的自拍.

  • 行动范围: 支助
  • Persona没有发布OpenAPI文件:合同(openapi.yaml)是手写自 Persona的API参考文献(JSON:API, Persona-Version: 2023-01-05和我们的EMR的Zod计划.

安装

npm install -D @crvouga/mockingbird-service-persona

仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务 npx mockingbird-persona serve, (中文(简体) ), createServer 从 ./server (节点),或 createRuntime 与 任何获取服务器.

使用量

将EMR指向模拟器(这些都需要在 E/config/env.ts:

EMR 掩体数值
PERSONA_API_URLhttp://127.0.0.1:8815 (或 …/__admin/ns/<namespace>(中文(简体) )
PERSONA_API_KEY任何持枪者(或已逝去者) --api-key(中文(简体) )
PERSONA_WEB_INQUIRY_URL, (中文(简体) ), PERSONA_MOBILE_INQUIRY_URLhttp://127.0.0.1:8815/verify
PERSONA_IDENTITY_INQUIRY_TEMPLATE_ID, (中文(简体) ), PERSONA_PHONE_INQUIRY_TEMPLATE_ID任意 itmpl_… 编号
PERSONA_WEBHOOK_SECRET以 --webhook-secret
npx mockingbird-persona serve --port 8815 \
  --webhook-url http://127.0.0.1:4000/v1/identify-verification/webhook \
  --webhook-secret "$PERSONA_WEBHOOK_SECRET"
import { createServer } from "@crvouga/mockingbird-service-persona/server"

// Test setup: a local Persona that posts its signed events to the app's webhook route.
const server = await createServer({
  webhooks: { url: "http://127.0.0.1:4000/v1/identify-verification/webhook", secret: "wbhsec_test" },
})
const baseUrl = server.url // the app's PERSONA_API_URL

// Application code: the request it sends to Persona.
const created = await fetch(`${baseUrl}/inquiries`, {
  method: "POST",
  headers: { authorization: "Bearer persona_sandbox_x", "content-type": "application/json" },
  body: JSON.stringify({
    data: { type: "inquiry", attributes: { "inquiry-template-id": "itmpl_identity", "reference-id": "patient-1" } },
  }),
})
const { data } = (await created.json()) as { data: { id: string } }

// Test control: finish it the way a member and Persona's workflow would: started → completed →
// approved, one signed event per step.
await fetch(`${baseUrl}/__admin/inquiries/${data.id}/approve`, { method: "POST" })

await server.close()

路线

路线行为
POST /inquiries亚庇: {data: {type: "inquiry", attributes: {inquiry-template-id | template-id, reference-id, redirect-uri, fields, note, platform}}} − 201个 {data: <inquiry>, included: []}状态 created编号 inq_ +24个字符。 没有模板 ~ 400; 模板未在 settings.templates (或无) itmpl_…编号 :tmpl_… (未定时) — 422. 输出 inquiry.created。 。 。 .
GET /inquiriesfilter[reference-id], (中文(简体) ), filter[inquiry-template-id], (中文(简体) ), filter[status] (comma名单), page[size] (1-100,默认为10), page[after]最先更新的; links.next 是下一页.
GET /inquiries/{id}调查,或404 {errors: [{title: "Record not found", detail, status: "404"}]}。 。 。 .
GET /verify?inquiry-id=&redirect-uri=主机流量页面( 上下行)PERSONA_WEB_INQUIRY_URL) (中文(简体) ). 开始调查pending, (中文(简体) ), inquiry.started),其链接完成.
GET /verify/complete?inquiry-id=&outcome=&redirect-uri=outcome =: approve, (中文(简体) ), decline, (中文(简体) ), needs_review, (中文(简体) ), complete 或者说 fail; 然后为 302 至 redirect-uri?inquiry-id=&status=&reference-id=。 。 。 .

查询资源带有Persona的属性(status, (中文(简体) ), reference-id, (中文(简体) ), note, (中文(简体) ), created-at, (中文(简体) ), started-at, (中文(简体) ), completed-at, (中文(简体) ), failed-at, (中文(简体) ), decisioned-at, (中文(简体) ), expired-at, (中文(简体) ), name-first编号 :name-last编号 :birthdate 从预填, fields 作为 {type, value}和 关系(inquiry-template.data {type: "inquiry-template", id}空无 reports, (中文(简体) ), verifications, (中文(简体) ), sessions, (中文(简体) ), documents, (中文(简体) ), selfies) (中文(简体) ). 错误为 JSON: API 带有 字符串 status我们的消费者 PersonaErrorSchema 要求.

认证 : Authorization: Bearer <key> 每个 API 路由( 丢失 ~ 401 JSON: API 错误) . PUT /__admin/settings {"apiKeys": [...]} 限制接受哪些密钥.

生命周期和网点

created → pending → completed → approved | declined | needs_review附加时 failed 财务报告和审定财务报表 expired 从公开调查。 关于公开调查的决定通过 completed 第一个 (作为完成流程和工作流程决定的成员),因此每个步骤都发出自己的信号 事件: inquiry.created, (中文(简体) ), inquiry.started, (中文(简体) ), inquiry.completed, (中文(简体) ), inquiry.approved, (中文(简体) ), inquiry.declined, (中文(简体) ), inquiry.marked-for-review, (中文(简体) ), inquiry.failed, (中文(简体) ), inquiry.expired。 。 。 .

每次活动都是Persona的信封, {data: {type: "event", id: "evt_…", attributes: {name, payload: {data: <inquiry>, included: [], meta: {}}, created-at}}},张贴于 Persona-Signature: t=<unix>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>。时间戳是 墙上钟. 非-2xx的答案被重审(立即,5s,5min,30min,2h); GET /__admin/webhooks, (中文(简体) ), /__admin/webhooks/events, (中文(简体) ), POST /__admin/webhooks/flush, (中文(简体) ), /__admin/webhooks/:id/replay 财务报告和审定财务报表 PUT /__admin/webhook-endpoints 到处工作.

管理员(超过标准合同)

路线效果
POST /__admin/inquiries/:id/{approve|decline|needs_review}目录的决定(通过 completed 调查尚未结束时).
POST /__admin/inquiries/:id/{start|complete|fail|expire}其他生命周期步骤. 非法行动为409起,身份不明的为404起.
GET /__admin/inquiries地名空间的查询.
GET/PUT /__admin/settings{apiKeys?: string[], templates?: string[]} 呼叫的命名空间.
POST /__admin/signature-faults{mode: "mismatch" | "short", count?}: 接下来的事件签名错误. mismatch 保持长度( 我们的接收者回答 401 ); short 切换十六进制( 我们的接收器) timingSafeEqual 掷出:500分.

错误预设( E)POST /__admin/faults {"preset": "<name>", "count"?: n}: list_fails (单位:千美元) 可重复使用的搜索500s;我们的客户端无法打开并创建), create_fails, (中文(简体) ), not_found, (中文(简体) ), unauthorized, (中文(简体) ), rate_limited (429个), server_error, (中文(简体) ), slow (3个s), webhook_duplicate, (中文(简体) ), webhook_reorder, (中文(简体) ), webhook_drop。 。 。 .

命名空间

x-mockingbird-namespace页:1 /__admin/ns/<name> 前缀在 PERSONA_API_URL 财务报告和审定财务报表 PERSONA_WEB_INQUIRY_URL (主机页面的链接保留它),或 API 密钥: PUT /__admin/credentials {"credentials": {"<PERSONA_API_KEY>": "<namespace>"}}。 。 。 .

我们的消费者用它做什么(差异)

  • 我们的EMR只行动于 status === "completed" (单位:千美元)updateIdentityVerificationForPatient(三); approved编号 :declined 事件被解析和忽略。 所以一个被拒绝的调查已经标记 经核查的成员 completed。模拟器发送两个事件 所以套房可以看到.
  • 我们的接收器比较签名和 crypto.timingSafeEqual,这表示长度 不匹配: 长度错误 v1= 是一个未发现的500,而不是一个401(signature-faults short) (中文(简体) ).
  • 我们的消费者没有正式的Persona Node SDK (Plade) fetch),所以没有SDK 滴入测试.

故意不模拟

  • 核查、报告、会话、文件和自拍:关系总是空的 没有政府ID或自拍捕捉。 主机页面是一组链接.
  • 调查模板的步骤和工作流程next-step-name 仅是 start 编号 : success),恢复 会话符号( e)POST /inquiries/{id}/resume、编辑、标签和账户.
  • 调查在计时器上已过期:调查仅通过 …/expire。 。 。 .
  • 嵌入式(JS SDK / iframe)流和移动式 SDK.

API 密码

导出仁爱说明
PersonaAPI类进程模拟器 : fetch(request), (中文(简体) ), reset(), (中文(简体) ), transition(id, action), (中文(简体) ), inquiries()选项: sqlite, (中文(简体) ), now, (中文(简体) ), namespace, (中文(简体) ), publicNamespace, (中文(简体) ), settings, (中文(简体) ), onWebhook。 。 。 .
createRuntime函数全面服务合同的仿真器(健康、管理、命名空间、证书、预设、网络呼号)。 选项 : webhooks: {url, secret, retryDelaysMs?, fetch?}, (中文(简体) ), settings, (中文(简体) ), clock, (中文(简体) ), seed, (中文(简体) ), adminKey, (中文(简体) ), onLog。 。 。 .
PERSONA_PRESETS对象每个命名的断层预设.
PERSONA_SIGNATURE_HEADER字符串"Persona-Signature"。 。 。 .
PERSONA_NAMESPACE, (中文(简体) ), PERSONA_VERSION字符串"persona", (中文(简体) ), "2023-01-05"。 。 。 .
INQUIRY_ACTIONS数组管理者生命周期行动.
inquiryResource函数将查询记录序列化为Persona's JSON:API资源.
personaErrors函数JSON: API 错误响应( 字符串) status) (中文(简体) ).
DEFAULT_SETTINGS对象默认每个名称空间设置 .
document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds数值销售商为OpenAPI合同及其业务代号.
createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT (单位:千美元)./server(中文(简体) )节点服务过来 node:http; 数据 serve CLI目标; 第8815口.

部分 嘲笑鸟。 。 。 .

版本与发布记录

@crvouga/mockingbird-service-persona 共发布 41 个版本,首次发布于 2026/09/23;过去 12 个月发布了 41 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.11.0latest2026/11/11今天
3.10.82026/11/038 天前
3.10.72026/11/038 天前
3.10.62026/11/038 天前
3.10.52026/11/038 天前
3.10.42026/11/038 天前

关于 @crvouga/mockingbird-service-persona 的常见问题

@crvouga/mockingbird-service-persona 是什么?

Persona身份验证API的状态仿真器:查询创建,列表(可重复使用查询),获取,主机流程页面,管理生命周期过渡,Persona-Signature webhoks.

如何安装 @crvouga/mockingbird-service-persona?

在项目目录运行 npm install @crvouga/mockingbird-service-persona,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 mockingbird-persona,可以用 npx mockingbird-persona 直接运行。

@crvouga/mockingbird-service-persona 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@crvouga/mockingbird-service-persona 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@crvouga/mockingbird-service-persona 可以商用吗?

@crvouga/mockingbird-service-persona 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@crvouga/mockingbird-service-persona 的下载量有多少?

根据 npm 官方下载统计,@crvouga/mockingbird-service-persona 在 2026/10/11 – 2026/11/09 这 30 天内被下载 2,912 次,日均约 97 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@crvouga/mockingbird-service-persona 还在维护吗?

最新版本 3.11.0 发布于 2026/11/11(今天);至今共发布 41 个版本,其中过去 12 个月发布了 41 个;首次发布于 2026/09/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。