开发中遇到过一键登录,去中心化提币功能,需要验证地址的中心化余额的功能,前端用到了web3.eth.personal.sign方法进行签名,后端用相应的库进行解签,以下是对接流程。
- 前端通过后端提供的接口获取要签名的信息message,传参address为当前冷钱包地址(签名的地址),后端要保存此地址对应的message,每次调用此接口都需要更新后端的message
function getNonce(params) {
return http.post(`/api/getNonce`, params);
}
let message= await getNonce({address: address})
- 获取到message后前端需要用web3.eth.personal.sign对message进行签名,传参address为当前冷钱包地址(签名的地址)
let signature = await web3.eth.personal.sign(data.web3.utils.toHex(message), address)
- 前端签完获取到signature, 需要调用后端接口把signature和address传给后端,后端接收到后对signature进行解签,解签用到的message 是后端保存的那个message
function doLogin(params) {
return http.post(`/api/doLogin`, params);
}
await doLogin({signature: signature, address: data.address})
- 后端解签后得到的签名的地址要和前端传的address比较,一致则验签成功。注意最好都转成小写在进行比较。