通过 MetaMask 连接验证用户是不是是 NFT 的所有者?确保连接用户的公共 eth 地址与 NFT 的相同?
Posted
技术标签:
【中文标题】通过 MetaMask 连接验证用户是不是是 NFT 的所有者?确保连接用户的公共 eth 地址与 NFT 的相同?【英文标题】:Verify user is owner of an NFT via MetaMask connection? Make sure connected users public eth address is the same as of the NFT?通过 MetaMask 连接验证用户是否是 NFT 的所有者?确保连接用户的公共 eth 地址与 NFT 的相同? 【发布时间】:2021-11-22 11:12:30 【问题描述】:我需要在我自己的域/服务器上验证连接 MetaMask 钱包的用户是特定 NFT 的所有者,以便允许他使用特殊功能?基本上,我想让用户访问只有这个 NFS 的所有者才能拥有的区域。
我原来的 NFT 在 opensea 中出售,但我不能使用 opensea 隐藏区域选项给用户一个隐藏密码,因为下一个所有者(转售后)和旧所有者将拥有相同的密码和旧所有者仍然可以这样访问。但我需要只有当前所有者才能访问。
我的用户/访问者已经可以在我自己的域中与 MetaMask 连接,并且我获得了活动帐户的公共 ETH 地址,但由于这只是 javascript 而我的后端是 php,我不能只将 MetaMask 信息发布到我的 PHP后端,因为这很容易被欺骗/破解。
如何确保当前连接的 MetaMask 帐户与 NFT 所有者(我知道)相同,并只允许该用户访问 URL?
我目前的状态是用户连接了他的 MetaMask,我使用 opensea API 来检查当前谁是 NFT 的所有者。我可以比较两个 eth 地址,但其中的缺陷显然是我使用 ajax 将 MetaMask 公共地址发送到我的后端,这仅用于测试,因为这当然是零保存!
提前感谢您提供任何想法、帮助和提示。
PS:我的后端是 PHP
【问题讨论】:
感谢您分享您的答案!给你的问题。我正在考虑与您类似的事情。为什么你想要一个密码让你的用户访问某个地方?这只是您想要的用户体验的一部分吗?您是否可以刚刚“通过 MetaMask 验证用户是 NFT 的合法所有者”并完成了 is 并以这种方式赋予他们功能? 【参考方案1】:经过数小时和数天的研究,我找到了适合我的解决方案。
这是所需的步骤。
-
使用 MetaMask API 让用户连接到您的站点。这在 MetaMask API 中非常简单且很好地解释了。
一旦您想验证 MetaMask 所有者是 NFT 的合法所有者,您需要首先查询 OpenSea(或其他地方)NFT 的当前所有者。就我而言,我将 OpenSea API 用于我的特定 NFT。找到所有者后,您就可以进行验证了。
在您的站点上,您需要要求用户使用 MetaMask 签署自定义消息。有不同的选择可以做到这一点。更多关于这里的信息:MetaMask Signing。例如,我发送一条简短的文本消息,其中包含我首先在我的 PHP 后端创建的唯一代码。这样做我还将代码和自定义消息保存到我的 mysql 中。
一旦用户签名,您将获得签名代码,您可以通过 ajax 等方式将其发送回您的 PHP 后端,没有任何问题。只有您在签名代码中请求的帐户所有者才能使用正确的帐户进行签名。
在 PHP 后端获得签名代码后,您可以在 PHP 中使用 Fast Elliptic Curve Cryptography 和 php-ecrecover 来检查代码与您之前创建的唯一代码和用户签名的消息是否相符。作为响应,您将获得签名者帐户的 ETH 地址并准备进行比较。如果签名者 ETH 地址与 NFT 所有者相同,则您可以开始使用,您可以将签名者视为 NFT 的所有者。
我相信这可以安全使用,但我不是这方面的专家。就我而言,这仅授权 NFT 所有者在我的社区页面中的某个封闭区域,并没有涉及到真正的高风险,但也许有人对此提出了一些安全想法。但是,我发现其他 NFT 页面甚至 Opensea 的工作方式类似。
我希望这为某人指明了正确的方向,因为大多数解决方案都是 Node.js 等,但不是 PHP 后端。
【讨论】:
这真的很酷;我也是新手;问题,这必须是元掩码吗?如果用户将其存储在受信任的钱包中怎么办?以上是关于通过 MetaMask 连接验证用户是不是是 NFT 的所有者?确保连接用户的公共 eth 地址与 NFT 的相同?的主要内容,如果未能解决你的问题,请参考以下文章
如果用户已经通过登录页面或 auth0 进行了身份验证,我们是不是需要在 websocket 连接中对用户进行身份验证?
如何将 MetaMask 与 Web3.js 版本 1.2.6 连接?