快速入门
身份验证快速入门。
从 sandbox 密钥到第一个签名 webhook,按步骤进行。每一步都有可运行的示例——复制后换上您自己的密钥和 URL 即可运行。
分步指南
七个步骤,一个下午。
获取 sandbox 密钥
在自助注册功能开发完成之前,sandbox 密钥(前缀 vk_sand_)按申请发放。请通过联系表单提出申请——大多数申请会在当个工作日内处理完成。Sandbox 会话不会计费,因此无需等待,现在就可以开始。
创建您的第一个会话
只需一次调用。发送 return_url(申请人完成后跳转到的页面)和 webhook_url(已签名结果的接收地址)。您将获得一个 session_id 和一个 verification_url。
bashcurl -X POST https://api.shieldid.ca/v1/sessions \ -H "X-Api-Key: vk_sand_your_key" \ -H "Content-Type: application/json" \ -d '{ "return_url": "https://yourapp.example/verified", "webhook_url": "https://yourapp.example/hooks/shieldid", "expected_name": "Jordan Smith", "locale": "en", "metadata": { "application_id": "app_9182" } }'将链接交给申请人
打开 verification_url,您会看到托管页面。在桌面浏览器上,页面会显示二维码——扫描后会将完全相同的链接传到手机上,而实际的证件拍照、活体检测挑战和自拍都在手机上完成。现在就用您自己的手机试一试。
搭建 webhook 端点
将 webhook_url 指向一个接受 POST 请求、读取原始请求正文(需要未经解析的正文才能校验签名)并返回 2xx 状态码的路由。若不满足这些条件,ShieldID 最多会重试投递三次。
javascriptimport express from "express"; const app = express(); app.post("/hooks/shieldid", express.raw({ type: "application/json" }), (req, res) => { // Verify the signature before you trust this body — see the next step. console.log("Received a webhook:", req.body.toString()); res.status(200).send("ok"); }); app.listen(3000);验证签名
在确认 webhook 正文确实来自 ShieldID 之前,请勿据此执行任何操作。请使用您的 webhook 密钥对原始正文计算 HMAC-SHA256,并与 X-Bio-Signature 标头进行比较。
javascriptimport crypto from "node:crypto"; function isValidShieldIdSignature(rawBody, signatureHeader, secret) { const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex"); const provided = signatureHeader || ""; const a = Buffer.from(expected, "hex"); const b = Buffer.from(provided, "hex"); return a.length === b.length && crypto.timingSafeEqual(a, b); } // rawBody must be the exact, unparsed request body app.post("/hooks/shieldid", express.raw({ type: "application/json" }), (req, res) => { const ok = isValidShieldIdSignature(req.body, req.headers["x-bio-signature"], process.env.SHIELDID_WEBHOOK_SECRET); if (!ok) return res.status(401).send("invalid signature"); const result = JSON.parse(req.body); // result.session_id, result.status, result.checks, … res.status(200).send("ok"); });查看结果
webhook 负载已包含您所需的全部信息。如果您更希望自行获取结果(例如在重定向之后),可以直接调用结果端点。
bashcurl https://api.shieldid.ca/v1/sessions/ses_9f2c1a/result \ -H "X-Api-Key: vk_sand_your_key" # → { "session_id": "ses_9f2c1a", "status": "VERIFIED", "checks": { "document": "PASS", … }, … }处理 FAILED 与重试
状态变为 FAILED 的会话会带有 failure_reason。请向申请人展示有用的信息。即将推出:重试 FAILED 会话,将其重置为 PENDING。目前,请将 FAILED 视为最终状态;如果申请人想再试一次,请创建新的会话。
上线之前
投入生产环境。
sandbox 与生产环境之间的请求格式完全一致,只有密钥不同。在让真实申请人通过 vk_live_ 会话进行验证之前,请先确认以下事项。
- 将 vk_sand_ 密钥替换为 vk_live_ 密钥。请求的其他部分无需任何更改。
- 将 webhook_url 指向一个真实、始终在线并会验证签名的端点——而不是 request-bin 或某台笔记本电脑。
- 在您的应用中处理全部三种最终状态:VERIFIED、FAILED 和 EXPIRED,而不仅仅是顺利通过的情况。
- 确认您的 return_url 能够读取 ShieldID 在重定向时附加的 session_id 和 status 查询参数。
- 通过 GET /v1/pricing/{country} 或定价页面查看当前价格,以免生产环境的费用出乎意料。
- 请勿让真实申请人有机会接触到 sandbox 密钥——sandbox 会话之所以免费,是因为它不是真实验证。
常见问题