使用 Nodejs、MetaMask 和 OpenSea 来进行 NFT登录

您所在的位置:网站首页 中国怎么用opensea 使用 Nodejs、MetaMask 和 OpenSea 来进行 NFT登录

使用 Nodejs、MetaMask 和 OpenSea 来进行 NFT登录

2024-05-26 19:39| 来源: 网络整理| 查看: 265

假设我们想要构建一个应用程序,其中只有来自特定集合的NFT的所有者才能登录。

0.jpg

假设我们想要构建一个应用程序,其中只有来自特定集合的NFT的所有者才能登录。

需要使用的技术: Nodejs用于后端/API。 用于客户端登录的MetaMask。 用于NFT所有权验证的OpenSea API。

这是Authenticating users to your web app using metamask and nodejs一文的后续,所有基本的metamask登录代码都在该文章中共享。链接:https://blog.devgenius.io/authenticating-users-to-your-web-app-using-metamask-and-nodejs-e920e45e358

下面是我们想要实现的流程:

1.jpg

我们将使用OpenSea API作为例子。

OpenSea API

OpenSea为开发人员提供了一个API来与他们的数据进行交互。我们可以在没有任何额外设置的情况下发出请求,但为了在实际应用程序中调用API,我们需要获得一个API密钥。可以在这里请求一个API密钥:

https://docs.opensea.io/reference/request-an-api-key

我们将使用资产端点来检索钱包拥有的NFT。可以在这里找到这个端点的完整信息:

https://docs.opensea.io/reference/getting-assets

要获取集合ID,我们可以直接在OpenSea文档页面上运行以下端点:

https://docs.opensea.io/reference/retrieving-a-single-asset

2.jpg

我们想要得到的值是" slug ":

3.jpg

所以,在这个例子中,我们可以这样请求:

GET https://api.opensea.io/api/v1/assets?owner=userWalletAddress&collection=boredapeyatchclub

4.jpg

端点将返回我们提供的 NFT 集合中用户拥有的所有 NFT。如果返回任何NFT,这意味着用户可以继续登录过程,否则,他将无法继续。

后端端点

下面的代码片段中可以找到实现此流程的Nodejs的工作代码片段。可以在下面链接中找到这个示例的所有其他代码片段。https://blog.devgenius.io/authenticating-users-to-your-web-app-using-metamask-and-nodejs-e920e45e358

// Process signed message router.post('/:user/signature', (req, res) => { // Get user from db db.get('SELECT * FROM users WHERE address = ?', [req.params.user], (err, row) => { if (err) { console.error(err.message); return res.status(500).send(err.message); } if (row) { const msg = `Nonce: ${row.nonce}`; console.log("User nonce from db: " + row.nonce); // Convert msg to hex string const msgHex = ethUtil.bufferToHex(Buffer.from(msg)); // Check if signature is valid const msgBuffer = ethUtil.toBuffer(msgHex); const msgHash = ethUtil.hashPersonalMessage(msgBuffer); const signatureBuffer = ethUtil.toBuffer(req.body.signature); const signatureParams = ethUtil.fromRpcSig(signatureBuffer); const publicKey = ethUtil.ecrecover( msgHash, signatureParams.v, signatureParams.r, signatureParams.s ); const addressBuffer = ethUtil.publicToAddress(publicKey); const address = ethUtil.bufferToHex(addressBuffer); console.log("Decrypted address: " + address); console.log("User address: " + req.params.user); // Check if address matches if (address.toLowerCase() === req.params.user.toLowerCase()) { // Run NFT ownership check if env flag is enabled if (process.env.RESTRICT_BY_NFT_COLLECTION == "true") { request.get(`https://api.opensea.io/api/v1/assets?owner=${req.params.user}&collection=${process.env.NFT_COLLECTION_SLUG}`, (err, response, body) => { if (err) { console.error(err.message); return res.status(500).send(err.message); } if (response.statusCode == 200) { if (JSON.parse(body).assets.length >= 0) { console.log("User owns NFT from collection - access granted"); // Update user nonce var newNonce = Math.floor(Math.random() * 1000000); db.run('UPDATE users SET nonce = ? WHERE address = ?', [newNonce, req.params.user], (err) => { if (err) { console.error(err.message); return res.status(500).send(err.message); } // Set jwt token const token = jwt.sign({ address: req.params.user, nonce: newNonce }, process.env.JWT_SECRET); return res.status(200).send({ success: true, token: `Bearer ${token}`, user: row, msg: "You are now logged in." }); }); } else { console.log("User does not own NFT from collection - access denied"); return res.status(403).send("User does not own NFT from collection"); } } else { console.log("User does not own NFT from collection"); return res.status(403).send("User does not own NFT from collection"); } }); } if (process.env.RESTRICT_BY_NFT_COLLECTION == "false") { // Update user nonce var newNonce = Math.floor(Math.random() * 1000000); db.run('UPDATE users SET nonce = ? WHERE address = ?', [newNonce, req.params.user], (err) => { if (err) { console.error(err.message); return res.status(500).send(err.message); } // Set jwt token const token = jwt.sign({ address: req.params.user, nonce: newNonce }, process.env.JWT_SECRET); return res.status(200).send({ success: true, token: `Bearer ${token}`, user: row, msg: "You are now logged in." }); }); } } else { return res.status(401).send({ success: false, msg: "Signature is invalid." }); } } else { console.log('User does not exist'); return res.status(404).send('User not found'); } }); }); 结论

这篇文章是一个简短而实用的教程,教我们如何在web应用中快速实现基于NFT所有权的认证。如果我们被卡住了,或者想要进一步理解上面提到的一些主题,可以看看这些资源:

OpenSea api 文档 SQLite 入门 Metamask 开发者文档 使用 Metamask 创建一个基本的去中心化应用程序 使用 express 创建 nodejs 应用程序 使用 passport-jwt 库生成 jwt 代币

Source:https://medium.com/@duartefdias/nft-login-with-nodejs-metamask-and-opensea-1ae3b49769bc

关于

ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。

本文首发于:https://mp.weixin.qq.com/s/uva0V4oNo2aIGFcbEMv12A

学分: 1 分类: DeFi 标签: NFT 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3