如何通过ZeroDev在后端验证用户并匹配对应钱包地址?
ZeroDev + Web3Auth 后端验证及地址匹配解决方案
核心原因:Web3Auth idToken 返回的是其托管的外部拥有账户(EOA)地址,而ZeroDev生成的是智能合约钱包(AA钱包)地址,二者本身并非同一对象,需通过身份绑定+签名验证的方式完成后端验证与地址关联。
1. 前端传递验证数据到后端
前端需向后端提交三个关键信息:
- Web3Auth 生成的
idToken:用于验证用户的Web3Auth身份合法性 - ZeroDev 智能合约钱包地址:通过ZeroDev签名器直接获取的地址
- 签名结果:前端用ZeroDev签名器对后端生成的随机
nonce签名后的字符串(用于证明用户拥有该ZeroDev钱包控制权)
2. 后端验证Web3Auth ID Token合法性
通过Web3Auth的JWKS公钥校验idToken的签名有效性,解析出用户唯一标识(sub字段)及Web3Auth托管EOA地址:
const jwt = require('jsonwebtoken'); const jwksClient = require('jwks-rsa'); // 初始化JWKS客户端,拉取Web3Auth公钥 const client = jwksClient({ jwksUri: 'https://api.web3auth.io/jwks' }); function getSigningKey(header, callback) { client.getSigningKey(header.kid, (err, key) => { const signingKey = key.publicKey || key.rsaPublicKey; callback(null, signingKey); }); } // 验证并解析idToken async function verifyWeb3AuthToken(idToken) { return new Promise((resolve, reject) => { jwt.verify(idToken, getSigningKey, { algorithms: ['RS256'] }, (err, decoded) => { err ? reject(err) : resolve(decoded); }); }); }
3. 验证ZeroDev钱包与用户身份的关联关系
采用EIP-1271智能合约签名验证(ZeroDev钱包遵循该标准),确认前端传入的ZeroDev地址确实属于当前用户:
- 后端生成随机
nonce,返回给前端; - 前端用ZeroDev签名器对
nonce做签名,将签名结果、ZeroDev地址、idToken一并传回; - 后端调用ZeroDev钱包合约的
isValidSignature方法,验证签名有效性:
// 实现EIP-1271验证逻辑 interface IERC1271 { function isValidSignature(bytes32 hash, bytes calldata signature) external view returns (bytes4); } function verifyZeroDevSignature(address zeroDevAddr, bytes32 nonceHash, bytes calldata signature) public view returns (bool) { IERC1271 wallet = IERC1271(zeroDevAddr); bytes4 magicValue = wallet.isValidSignature(nonceHash, signature); // EIP-1271标准返回值为0x1626ba7e return magicValue == 0x1626ba7e; }
4. 完成用户注册/验证
- 当
idToken验证通过,且ZeroDev签名验证通过后,后端将Web3Auth用户的sub(唯一ID)与ZeroDev钱包地址绑定存储; - 后续用户请求时,只需验证
idToken有效性,即可通过sub查询到对应的ZeroDev钱包地址,完成身份校验。
内容的提问来源于stack exchange,提问作者common task
相关产品推荐
相关产品推荐

