通过 MetaMask 连接验证用户是否是 NFT 的所有者?确保连接用户的公共 eth 地址与 NFT 的相同吗?

Oli*_*ver 11 authentication metamask nft

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

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

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

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

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

预先感谢您提供我能得到的任何想法、帮助和提示。

PS:我的后端是PHP

Oli*_*ver 19

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

以下是所需的步骤。

  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 后端。