问题描述
我想创建无密码身份验证(使用 Metamask 对消息进行签名;然后在服务器上验证消息,然后分配 JWT 令牌)。我希望将用于签署消息的部分写入 vanila javascript 文件中。
我在网上看到的大部分文章都是 2018 年的,讨论使用 web3 中的 web3.eth.personal.sign
方法,该方法由 Metamask 注入浏览器。但是我知道 Metamask 不再是这种情况。现在不再注入 web3,我调用什么函数来使用 Metamask 签署消息?
我尝试过的...
我知道有一个 window.ethereum
对象注入浏览器,但我似乎无法在 Metamask Documentaiton 中找到 web3.eth.personal.sign
我猜另一种方法是使用不带 web3
的 window.ethereum
但如何将其注入到 vanilla javascript 文件中?另外,如果我只是将 web3 用作独立的,如何确保消息由 Metamask 签名?
解决方法
您可以使用 web3 npm package。然后您可以使用以下命令将其连接到 Metamask:
import Web3 from "web3";
window.ethereum.request({ method: "eth_requestAccounts" });
const web3 = new Web3(window.ethereum);
这将弹出 metamask 并要求用户选择一个帐户。
然后要签署消息,您可以使用以下命令调用 web3:
const dataToSign = "My test message";
const accounts = await web3.eth.getAccounts();
const signature = await web3.eth.sign(dataToSign,accounts[0]);
文档:https://web3js.readthedocs.io/en/v1.3.4/web3-eth.html#sign
这将导致 Metamask 要求用户使用他们当前活动的帐户对数据进行签名。我不确定如何验证签名是否正确。