Web3js

如何驗證 MetaMask 賬戶持有人是地址的真實所有者?

  • June 10, 2021

我正在製作一個呼叫 Node.js 伺服器的 dapp。我希望使用者安裝了 MetaMask,並且我想驗證他是 MetaMask 上目前地址的真正所有者(即accounts[0])。

這是我試圖實現的使用者流程:

  1. 使用者在他的瀏覽器中載入我的 dapp 前端。
  2. 瀏覽器accounts[0]從 Web3/MetaMask 獲取。
  3. accounts[0]前端從我的 Node.js API請求一些特定的數據。
  4. 在 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.

引用自:https://ethereum.stackexchange.com/questions/35486