7

我需要在我自己的域/服务器上验证连接了 MetaMask 钱包的用户是特定 NFT 的所有者,以便允许他使用特殊功能?基本上,我想让用户访问只有这个 NFS 的所有者才能拥有的区域。

我原来的 NFT 在 opensea 出售,但我不能使用 opensea 隐藏区域选项给用户一个隐藏密码,因为下一个所有者(转售后)和旧所有者将拥有相同的密码并且旧所有者仍然可以访问像这样。但我需要只有当前所有者才能访问。

我的用户/访问者已经可以在我自己的域中与 MetaMask 连接,并且我获得了活动帐户的公共 ETH 地址,但由于这只是 javascript 而我的后端是 PHP,我不能只将 MetaMask 信息发布到我的 PHP 后端,因为这很容易被欺骗/破解。

如何确保当前连接的 MetaMask 帐户与 NFT 所有者(我知道)相同,并只允许该用户访问 URL?

我目前的状态是用户连接了他的 MetaMask,我使用 opensea API 来检查当前谁是 NFT 的所有者。我可以比较两个 eth 地址,但其中的缺陷显然是我使用 ajax 将 MetaMask 公共地址发送到我的后端,这仅用于测试,因为这当然是零保存!

提前感谢您的任何想法,帮助,我能得到的小费。

PS:我的后端是 PHP

4

1 回答 1

13

经过数小时和数天的研究,我找到了一个适合我的解决方案。

这是所需的步骤。

  1. 使用 MetaMask API 让用户连接到您的站点。这在 MetaMask API 中非常简单且很好地解释了。
  2. 一旦您想验证 MetaMask 所有者是 NFT 的合法所有者,您需要首先查询 OpenSea(或其他地方)NFT 的当前所有者。就我而言,我将 OpenSea API 用于我的特定 NFT。获得所有者后,您就可以进行验证了。
  3. 在您的网站上,您需要要求用户使用 MetaMask 签署自定义消息。有不同的选择可以做到这一点。更多关于这里的信息:MetaMask 签名。例如,我发送一条简短的文本消息,其中包含我首先在我的 PHP 后端创建的唯一代码。这样做我还将代码和自定义消息保存到我的 MySQL 中。
  4. 用户签名后,您将获得签名代码,您可以通过 ajax 等将其发送回您的 PHP 后端,而不会出现问题。只有您在签名代码中请求的帐户所有者才能使用正确的帐户进行签名。
  5. 在 PHP 后端获得签名代码后,您可以使用 PHP 中的快速椭圆曲线密码术和php-ecrecover来对照您之前创建的唯一代码和用户签名的消息检查代码。作为响应,您将获得签名者帐户的 ETH 地址并准备进行比较。如果签名者 ETH 地址与 NFT 所有者相同,您就可以开始了,您可以将签名者视为 NFT 的所有者。

我相信这可以安全使用,但我不是这方面的专家。就我而言,这仅授权 NFT 所有者对我的社区页面中的某个封闭区域进行授权,并没有涉及到真正的高风险,但也许有人对此提出了一些安全想法。但是,我发现其他 NFT 页面甚至 Opensea 的工作方式类似。

我希望这为某人指明了正确的方向,因为大多数解决方案都是 Node.js 等,但不是 PHP 后端,所以我花了很多时间弄清楚这一点。

于 2021-10-01T17:57:45.883 回答