Email Verification API 服务端验证清单:audience、nonce、exp 缺一不可
【免费下载链接】email-verificationverified autofill项目地址: https://gitcode.com/GitHub_Trending/em/email-verification
Email Verification API(EVP,Email Verification Protocol)是一项让网站不发验证邮件、直接用密码学令牌验证邮箱所有权的浏览器新标准。本文给出一份服务端验证清单:收到令牌后,audience、nonce、exp三项缺一不可,漏掉任何一项都可能让令牌被重放或跨站盗用。
📌 它解决什么问题?
传统邮箱验证要"发邮件 → 用户切到收件箱 → 抄回验证码",既费时间又容易被钓鱼。EVP 的思路是复用用户已登录邮箱服务的会话:浏览器直接向邮箱服务商(Issuer)申请一个签名令牌 EVT(Email Verification Token),再自动填入你的表单,服务端完成校验即可,全程无需人工验证码。
提案中的完整交互时序图可参考 README.md,浏览器端扩展与验证流程规范则定义在 index.bs 中。
🧩 三方模型:谁发令牌、谁验令牌?
| 角色 | 身份 | 职责 |
|---|---|---|
| Verifier | 你的网站 | 生成nonce、接收并提交表单、服务端验签 |
| User Agent | 浏览器 | 发现 Issuer、申请 EVT、把令牌绑定到表单 |
| Issuer | 邮箱服务商 | 验证登录态、签发带签名的 EVT |
网站只需在表单里加一行隐藏输入框:
<input type="hidden" name="token" nonce="<?php generate_nonce() ?>" autocomplete="email-verification-token">其中nonce必须由服务端生成——一个加密学上足够强的随机值,且每次页面渲染都唯一(index.bs#L101-L109)。浏览器会把你的域名(origin)和这个nonce一起"绑死"在令牌上,这就是 KB-JWT 键绑定(index.bs#L136)。
✅ 服务端验证清单:三步核心校验
表单提交后,服务端收到email+ 令牌两个字段。按规范 Verifier Processing Model 与 Replay Attacks,必须依次校验:
1️⃣ 校验audience:令牌是发给"我的"网站吗?
audience应等于你自己的 origin(如https://rp.example)。- 漏检后果:攻击者截获用户在你站上的令牌,原样投递到攻击者控制的站点,若受众校验缺失,令牌照样"看起来合法"。
2️⃣ 校验nonce:令牌对应"这次"表单吗?
nonce必须与本次页面渲染时服务端生成的那一个严格一致。- 建议用后即焚:校验成功后立即从会话/缓存中删除,防止同一令牌被重复提交。
- 漏检后果:同一令牌可无限重放,注册流程形同虚设。
3️⃣ 校验exp:令牌还"活着"吗?
exp(过期时间)声明必须未过期,校验时应带少量时钟偏差容忍,但窗口要小。- 漏检后果:历史截获的令牌永久有效,等于长期后门。
4️⃣ 附加校验:邮件地址一致性
从令牌中提取已验证的email,与表单里用户填的值做大小写不敏感比对,不一致即失败(index.bs#L212-L213)。别忘了令牌本身还需通过 Issuer 公钥验签(它是签名 SD-JWT),验签细节在 EVT Issuance 一节。
💡 一句话记忆:签名保真伪,audience 保站点,nonce 保这一次,exp 保时间,email 保人。
🛡️ 为什么这三项能防重放?
令牌通过键绑定(Key-Binding JWT)同时锚定了audience(你的站点)和nonce(本次表单),所以:
- 换个网站用?
audience不匹配 → 拒绝 - 换次会话重放?
nonce已被消费 → 拒绝 - 过段时间再交?
exp过期 → 拒绝
这正是规范在安全章节明确要求 Verifier "MUST verify" 的三项(index.bs#L233-L237)。
🪜 优雅降级:不支持的浏览器怎么办?
浏览器不支持或邮箱服务商未接入时,隐藏输入框就是空的——此时静默回退到传统验证码流程即可,无需任何报错。这也是 EVP 的设计目标之一:渐进增强、零行为破坏(README.md)。想本地体验完整流程,可参照 HOWTO.md 中的 Chrome 开启步骤。
📚 延伸阅读
- 提案背景与生态分析:README.md
- 规范全文(HTML 扩展、浏览器处理模型、验证模型):index.bs
- 浏览器端手动测试指南:HOWTO.md
- 贡献与讨论入口:CONTRIBUTING.md、QUESTIONNAIRE.md
【免费下载链接】email-verificationverified autofill项目地址: https://gitcode.com/GitHub_Trending/em/email-verification
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考