Web3js

您如何在伺服器端驗證 Metamask 簽名?

  • October 22, 2021

我希望我的伺服器能夠根據使用者是否擁有錢包的私鑰來對使用者進行身份驗證。我在前端使用 web3.js,在後端使用 web3.py。

場景將是這樣的:

在此處輸入圖像描述

現在我只關心第 3 步(沒有隨機數)和第 4 步。

這是我在前端的程式碼:

       //Instantiate Web3
       const Web3 = require("web3");

       //Get Metamask web3 provider
       var web3 = new Web3(Web3.givenProvider);

       //Connect to Metamask (not sure how to do like web3.eth.connect)
       await window.ethereum.enable();

       //Get wallet address (public key)
       var accounts = await web3.eth.getAccounts();
       const walletAddress = accounts[0];

       //TO-DO: Message should be generated on server side with a nonce
       const message = "helloworld";

       //Sign message with Metamask (private key)
       const signedMessage = await web3.eth.personal.sign(
         message,
         walletAddress
       );

在我的 Django 後端,我正在創建一個這樣的 API: http://localhost:8000/verify/claimedWallet/message/signedMessage

(這個 params 約定對我來說很重要,但這是 Python Dev discord 中推薦的。)

如何使用 web3.py 從消息和簽名消息中恢復地址?

謝謝!

這對我有用:

您將需要一個 Web3 提供程序,例如:

w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/api_key')

您可以使用消息和簽名恢復地址,如下所示:

encoded_message = encode_defunct(bytes(message, encoding='utf8'))
recoveredAddress = w3.eth.account.recover_message(encoded_message , signature)

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