import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({
apiKey: process.env.BIRD_API_KEY!,
});
// Send the code, then check it by recipient.
await bird.verify.verifications.create({
to: { phone_number: "+15551234567" },
}).safe();
const { data, error } = await bird.verify.verifications.check({
to: { phone_number: "+15551234567" },
code: userInput,
}).safe();
if (error) throw error;
您的账户
确认是您本人。
输入发送至以下号码的验证码
+1 ••• ••• 4567示例验证码
安全默认内置,而非额外附加。
Bird Verify API 上的每次验证都具有相同的保护:验证码在服务端生成,永不返回,仅以哈希形式存储;校验以恒定时间运行,并受有限的尝试次数约束;发送量按接收方和工作区设上限。你无需主动启用或自行配置——这就是 API 的运作方式,无论你用它做双因素登录还是免密登录。
每次验证的五重保护。
无需配置步骤,无需额外购买。
- 01
加密随机生成。
验证码从加密随机源中生成,在整个码空间内均匀分布,而非使用可预测的计数器或时间戳。
- 02
静态哈希存储,永不外传明文。
每个验证码仅以 HMAC-SHA256 哈希形式存储;明文永远不会被 API 返回,也不会写入你的技术栈或我们的日志。
- 03
恒定时间比较。
提交的验证码以恒定时间进行比较,攻击者无法从校验耗时中获取任何信息。
- 04
尝试次数锁定。
每个会话有有限的校验次数(默认 5 次)。用完后会话即失败,猜测无法无限进行。
- 05
发送上限。
按接收方的发送上限和重新发送冷却时间限制了开支和滥用面,超限时均返回 429 及 Retry-After。
猜测次数耗尽在用户之前。
错误的验证码会返回剩余尝试次数,预算用尽后会话即失败——暴力破解循环在找到验证码之前就已碰壁。
const { data, error } = await bird.verify.verifications.check({
to: { phone_number: "+15551234567" },
code: guess,
}).safe();
if (error) throw error;
// wrong code, attempts left → { success: false, reason: "incorrect_code", attempts_remaining: 2 }
// budget spent, session done → { success: false, reason: "attempts_exhausted", attempts_remaining: null }即将推出:欺诈信号和 SMS 刷量保护。
Verify 目前记录的每次发送历史,是我们正在构建的欺诈层的基础。它复用相同的 create 和 check 调用,因此后续采用只需更改配置,无需重新集成。
创建时的风险信号。在验证请求中传递设备、IP 和请求上下文,高风险的尝试会在验证码发出之前被拦截——你不必为向攻击者发消息付费。
SMS 刷量和人为流量攻击防护。按国家和号码前缀的发送上限加上工作区级别的支出上限,阻止将 OTP 发往高价号段以套取运营商分成的人为虚增流量攻击。
基于现有基础构建。风险决策读取 Verify 从第一天起保存的尝试历史,拦截结果已包含在状态模型中,因此欺诈层的上线无需重构你的集成。
规模扩展
不失控。
在工作区中组织团队,控制 API 访问权限,通过审计日志追踪变更。
审计日志
生产环境- 工作区
- 生产环境
- 资源
- 发送代理
- 读取权限读写