技术栈:
- 前端: WalletConnect + wagmi + viem
- 后端: Go + Gin + go-ethereum(高性能API服务)
一、系统架构设计
1.1 完整流程图
CodeBlock Loading...
1.2 Nonce机制(防重放攻击核心)
什么是Nonce?
Nonce(Number used ONCE)是一次性随机数,每次登录都不同。
为什么需要Nonce?
CodeBlock Loading...
关键安全措施:每次请求都生成新nonce
CodeBlock Loading...
为什么每次都要刷新?
CodeBlock Loading...
1.3 JWT Token(无状态会话管理)
验证签名成功后,后端返回JWT token用于后续请求认证。
JWT结构:
CodeBlock Loading...
使用方式:
CodeBlock Loading...
优势:
- ✅ 无状态: 服务器不需要存储会话
- ✅ 可扩展: 可在多个服务间共享
- ✅ 安全: 使用密钥签名,防止篡改
JWT详细原理见第一篇文章,这里不再展开。
二、前端实现
2.1 项目结构
CodeBlock Loading...
2.2 安装依赖
CodeBlock Loading...
2.3 配置wagmi(核心配置)
创建wagmi配置:
CodeBlock Loading...
环境变量:
CodeBlock Loading...
在根布局中使用:
CodeBlock Loading...
2.4 钱包连接(使用wagmi Hooks)
连接按钮组件:
CodeBlock Loading...
ConnectKit的优势:
- 🎨 内置美观的UI界面
- 🔌 自动支持多种钱包(MetaMask、WalletConnect、Coinbase Wallet等)
- 📱 响应式设计,支持移动端
- ⚡ 开箱即用,无需额外配置
2.5 签名登录(核心流程)
API调用封装:
CodeBlock Loading...
登录按钮组件:
CodeBlock Loading...
关键点:
- ✅
useSignMessageHook自动处理签名 - ✅
signMessageAsync自动添加EIP-191前缀(与后端accounts.TextHash匹配) - ✅ 支持所有wagmi配置的钱包
- ✅ 自动处理错误和加载状态
2.6 完整页面组合
CodeBlock Loading...
用户信息组件:
CodeBlock Loading...
三、后端实现
3.1 项目结构
CodeBlock Loading...
3.2 安装依赖
CodeBlock Loading...
3.3 数据库模型
CodeBlock Loading...
3.4 签名验证(使用官方方法)
CodeBlock Loading...
3.5 认证处理器
获取Nonce接口:
CodeBlock Loading...
登录验证接口:
CodeBlock Loading...
3.6 JWT工具
CodeBlock Loading...
3.7 JWT中间件
CodeBlock Loading...