Web3js
如何驗證 MetaMask 賬戶持有人是地址的真實所有者?
我正在製作一個呼叫 Node.js 伺服器的 dapp。我希望使用者安裝了 MetaMask,並且我想驗證他是 MetaMask 上目前地址的真正所有者(即
accounts[0]
)。這是我試圖實現的使用者流程:
- 使用者在他的瀏覽器中載入我的 dapp 前端。
- 瀏覽器
accounts[0]
從 Web3/MetaMask 獲取。accounts[0]
前端從我的 Node.js API請求一些特定的數據。- 在 Node.js 伺服器上,我需要驗證請求是否來自實際擁有地址的私鑰的人
accounts[0]
。如果這是有效的,那麼我會用具體的數據來回應。我花了很長時間研究 Web3 的不同簽名功能,結果我很困惑。有:
web3.eth.sign
- 沒有recover
與之對應的,MetaMask 不會彈出要求使用者簽名。web3.eth.personal.sign
- 這個需要密碼,我不想讓使用者輸入他的密碼,MetaMask不應該這樣做嗎?web3.eth.accounts.sign
- 這似乎更像是一個散列函式而不是我需要的。我有一種感覺,以上三個功能都不是我需要的。有人可以就如何解決這個問題提供一些指導嗎?
我認為
web3.eth.sign
這是您想要的,但請注意,它需要一個 32 字節的字元串(通常是消息的雜湊)。這對我有用:
web3.eth.sign(web3.eth.defaultAccount, web3.sha3('test'), function (err, signature) { console.log(signature); // But maybe do some error checking. :-) });
然後在伺服器上,使用
ethereumjs-util
:const util = require('ethereumjs-util'); const sig = util.fromRpcSig('<signature from front end>'); const publicKey = util.ecrecover(util.sha3('test'), sig.v, sig.r, sig.s); const address = util.pubToAddress(publicKey).toString('hex');
您說“MetaMask 不會彈出要求使用者簽名”,但它應該這樣做。如果還是不行,請分享你用來呼叫的程式碼
web3.eth.sign
。編輯
請注意,在 web3.js 1.0 中,它
web3.util.sha3
不是web3.sha3
.