本章深入剖析了 Web3 登录中最核心的认证机制 —— 数字签名,帮助读者理解从「输入密码」到「签名消息」的本质转变。通过对 eth_sign
、personal_sign
、EIP-191 等签名标准的讲解,我们构建了完整的签名验证流程,包括签名格式、地址恢复与安全对比。同时明确了前端负责签名
📚 作者:Henry 🧱 系列:《Web2 到 Web3:登录与身份验证机制全面进化》 · 第 2 篇 👨💻 受众:Web2 & Web3 开发者 / 区块链学习者 👉 系列持续更新中,建议收藏专栏或关注作者
在 Web2 登录中,用户身份的认证依赖服务端验证用户输入的密钥(password)是否与数据库中哈希后的记录匹配:
四个角色:用户(User)、客户端(Client)、服务器(Server,隐含)、数据库(Database)
在 Web3 中,用户从不提交凭证。服务端也不“知道”用户是谁,而是通过验证“这段消息是否由该地址私钥签名”来确认身份。
换句话说:用户不是提供密码,而是证明“我能控制这个地址”
0x...
)传递给前端。recoverAddress
等方法验证签名是否能还原出用户地✅ 消息模版的生成与签名,始终遵循:由后端创建消息模版,前端只负责展示并发起签名
在整个签名登录过程中,前端与后端有明确的分工:
步骤 | 负责方 | 内容 |
---|---|---|
① 请求 message | 前端 | 向后端 /auth/message 请求带 nonce 的签名消息体 |
② 返回模版 | 后端 | 返回包含 nonce / domain / address / time 等字段的完整 message |
③ 发起签名 | 前端 | 使用钱包 signMessage(message) 或 signTypedData 进行签名 |
④ 验证签名 | 后端 | 使用 recoverAddress 校验签名是否来自指定地址 |
⑤ 签发 JWT | 后端 | 验签成功后,返回 accessToken / JWT,前端存储登录状态 |
// 前端通过接口请求,获取到后端维护好的消息模板;前端根据消息模版的形式,构建好待签名的消息,如:
const message = `
${domain} wants...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!