开始使用
Orbit 账户的组织方式、控制台各处的功能,以及从登录到让我们的网络开始应答一个域名的最短路径。
在表单里放一个容器,并在服务器上确认令牌。多数访客只会看到一个对勾。
<script src="https://verify.yunzheng.space/v1.js?v=1.4.0" async defer></script>
<form method="post" action="/login">
<div class="orbit-verify" data-sitekey="ovk_…" data-action="login"></div>
<button type="submit">Sign in</button>
</form>脚本会渲染页面上每一个 .orbit-verify 容器,并向其所在表单注入名为 orbit-verify-response 的隐藏字段。site key 在控制台的 Verify 页面创建。
每个 site key 带一个安全等级。所有等级施加的检查完全相同:User-Agent 与页面上报的平台是否一致、浏览器自行附加而页面脚本无法设置的请求头、浏览器 API 与所声称版本是否相符、交互与时序,以及网络与设备历史。等级决定三件事:要求访客确认的风险分阈值、拒绝请求的风险分阈值,以及工作量证明的成本。
| 等级 | 要求确认阈值 | 拒绝阈值 | 工作量证明 |
|---|---|---|---|
standard | 0.35 | 0.70 | 16 位 |
strict | 0.25 | 0.55 | 17 位 |
maximum | 0.15 | 0.40 | 18 位 |
建议:注册、登录、找回密码与支付使用 maximum;评论与联系表单使用 strict;低价值提交使用 standard。本站的实时小组件运行在 maximum。等级在控制台按 key 设置。
如果你的页面发送 Content-Security-Policy,请在 connect-src 里同时列出两个验证主机:https://verify.yunzheng.space https://verify.edge.yunzheng.space。widget 会先问最近的边缘节点,不通时自行回退到第一个主机 —— 只写第一个仍然可用,只是放弃了更近的那次应答。
| 属性 | 作用 |
|---|---|
data-sitekey | 必填。控制台生成的 key。 |
data-action | 标签,siteverify 会原样返回。用它区分登录与注册。 |
data-theme | auto、light 或 dark。 |
data-size | normal 或 compact。 |
data-lang | en 或 zh-CN。不设时跟随页面语言。 |
表单字段里的令牌在你确认之前没有任何价值。请在处理提交之前,在服务端确认一次。
const r = await fetch("https://verify.yunzheng.space/v1/siteverify", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
secret: process.env.ORBIT_VERIFY_SECRET,
response: req.body["orbit-verify-response"],
remoteip: req.ip,
}),
});
const v = await r.json();
// { success, challenge_ts, hostname, action, score, "error-codes": [] }
if (!v.success) return res.status(400).send("verification failed");success,还要检查 hostname 与 action。令牌只能证明有人通过了某次检查 —— 检查这两个字段,才把它绑定到你的站点上的这个表单。一个令牌只能确认一次。对同一令牌的第二次确认会失败 —— 这正是阻止提交被重放的机制。
通常不需要。检查自动完成并显示一个对勾。信号不佳时,小组件会变成一个复选框 —— 点一下即可,永远不会出现图片拼图。
不能。检查在浏览器中运行,禁用脚本的访客无法完成。如果你必须服务这类访客,请为他们保留一条非表单路径。