我刚刚在一个项目里完成了 SIWE(使用以太坊登录)的集成,想把我学到的内容分享出来,因为一旦你理解了核心概念,这个过程其实相当直观、简单。



先说说以太坊登录(Sign-In with Ethereum)。它本质上是一种方式,用来验证你确实拥有某个钱包地址。当你把钱包连接到一个 dapp(去中心化应用)时,前端知道你是谁,但后端却无法验证你是否真的不是“假装拥有该地址”的人。SIWE 的做法是让你对一条消息进行签名,从而证明你确实拥有对应的私钥。它和交易的工作方式类似——你用私钥对某些内容进行签署。

整个流程可以拆成三个主要步骤:连接钱包、签署消息、然后获取身份令牌。理解之后,流程非常顺畅。

不过并不是每个 dapp 都需要 SIWE。如果你在做比如区块浏览器这类应用,用户只是查询公开数据,那么其实没必要使用它。但如果你的 dapp 有用户账号,或者会处理敏感数据,SIWE 就会变得非常有价值。

我最终选择用 Next.js 来完成全栈实现,因为你可以在同一个项目里同时处理前端和后端。起步时我使用了像 Ant Design Web3 和 Wagmi 这样的 npm 包——它们能帮你处理掉大量繁重的工作。你可以通过 npm 用一条命令安装核心依赖,这能节省很多搭建时间。

签名流程首先是从你的后端获取一个 nonce(随机数)。这个 nonce 对每个地址都是唯一的,可以防止重放攻击。然后你构造一条包含 nonce、域名和链 ID 的消息,用你的钱包对它进行签名,并把所有内容返回给后端以完成验证。如果签名有效,你就会拿到一个 JWT(JSON Web Token)令牌,用于后续请求。

我注意到的一点是:使用默认的 RPC 节点会让验证过程大约花 30 秒,这对用户体验来说非常糟糕。把它切换成专用的节点服务(我用的是 ZAN)后,速度提升得非常明显。如果你准备上线生产环境,这个优化绝对值得。

文档里提到的安全注意事项很重要:他们提供的演示代码只是用于教学。用于生产环境时,你需要正确处理 JWT、做速率限制,以及采取其他必要的安全防护。不要把示例代码原样复制到生产环境中。

如果你正在构建一个需要用户身份认证的 dapp,那么 SIWE 基本已经成为现在的标准做法了。npm 生态已经发展得足够成熟,因此集成起来比以前省事得多。
ETH-0.84%
查看原文
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 评论
  • 转发
  • 分享
评论
请输入评论内容
请输入评论内容
暂无评论