使用 React、Web3.js 和 Metamask 构建 Web3 dApp 身份验证

这篇具有很好参考价值的文章主要介绍了使用 React、Web3.js 和 Metamask 构建 Web3 dApp 身份验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我相信您和我一样对 Web3 充满热情。本文介绍了一种新的区块链开发登录方法:使用 MetaMask 扩展的一键式加密安全登录流程,所有数据都存储在我们自己的后端。它还可以保护我们的数据和加密货币的安全。

在这里,我们将构建一个允许用户使用 MetaMask 登录的身份验证解决方案。

什么是MetaMask ?

MetaMask 是一个浏览器扩展和应用程序,将自己描述为加密钱包和区块链应用程序的网关。MetaMask 可作为浏览器扩展使用,您可以下载、安装和使用它。MetaMask 可帮助您管理控制您的以太坊地址的私钥,并促进加密交易和与区块链应用程序的交互。

他们的公共以太坊地址将用作唯一标识符,我们将使用 MetaMask 公开的私钥管理工具为用户提供一种机制来证明他们拥有该特定地址,从而有权以该用户身份登录。

先决条件

您需要先在浏览器中安装 Metamask 钱包Meta mask 网站。有了这个,您将可以访问一个独特的 Ethtereum 公共地址,您可以使用该地址开始发送和接收以太币或代币。但是,我们将通过连接到您的 metamask 钱包并显示信息来保持简单。

深入研究我们的代码

我们将创建一个新的 React 项目,并开始编写一些我们需要连接 Metamask 钱包的函数。

让我们从检测当前浏览器是否有 window.ethereum API 开始。MetaMask 将全球 API 注入其用户在 window.ethereum 访问的网站。该 API 允许网站请求用户的以太坊帐户,从用户连接的区块链中读取数据,并建议用户签署消息和交易。

window.ethereum

该 API 允许网站请求用户登录,从用户连接的区块链加载数据,并建议用户签署消息和交易。您可以使用此 API 来检测 web3 浏览器的用户。

window.web3

window.web3 仅在使用 http 或 https 协议查看页面时由 MetaMask 注入。因此,我们将检查这两个 API 是否已在网站中注入。

  const detectCurrentProvider = () => {
    let provider;
    if (window.ethereum) {
      provider = window.ethereum;
    } else if (window.web3) {
      provider = window.web3.currentProvider;
    } else {
      console.log(
        'Non-Ethereum browser detected. You should consider trying MetaMask!'
      );
    }
    return provider;
  };

使用此功能,我们将知道我们是否有可用的 API,如果没有,我们将简单地记录消息。

让我们安装我们将要使用的 Web3 包。Web3.js 是以太坊区块链的 JavaScript 接口。

-获取链的最新区块(web3.eth.getBlockNumber)
-查看MetaMask上当前活跃的账户(web3.eth.coinbase)
-获取任何账户的余额(web3.eth.getBalance) -
-发送交易(web3.eth.getBalance) eth.sendTransaction)
-使用当前账户的私钥签署消息 (web3.personal.sign)

还有很多

我们现在将创建下一个函数,它将与 Web3.js 库通信并获取我们所需的信息。

 const onConnect = async () => {
    try {
      const currentProvider = detectCurrentProvider();
      if (currentProvider) {
        if (currentProvider !== window.ethereum) {
          console.log(
            'Non-Ethereum browser detected. You should consider trying MetaMask!'
          );
        }
        await currentProvider.request({ method: 'eth_requestAccounts' });
        const web3 = new Web3(currentProvider);
        const userAccount = await web3.eth.getAccounts();
        const chainId = await web3.eth.getChainId();
        const account = userAccount[0];
        let ethBalance = await web3.eth.getBalance(account); // Get wallet balance
        ethBalance = web3.utils.fromWei(ethBalance, 'ether'); //Convert balance to wei
        saveUserInfo(ethBalance, account, chainId);
        if (userAccount.length === 0) {
          console.log('Please connect to meta mask');
        }
      }
    } catch (err) {
      console.log(
        'There was an error fetching your accounts. Make sure your Ethereum client is configured correctly.'
      );
    }
  };

在上面的代码中,我们有一个异步函数,它将调用 Metamask 并获取我们请求的信息。我们想要获取有关我们的帐号、链 ID、帐户和 ETH 余额的信息。您可能还注意到我们还没有创建保存用户信息的功能。让我们创建一个将用户帐户信息保存到本地存储的函数,以便我们可以持久保存信息,除非断开连接。

 const saveUserInfo = (ethBalance, account, chainId) => {
    const userAccount = {
      account: account,
      balance: ethBalance,
      connectionid: chainId,
    };
    window.localStorage.setItem('userAccount', JSON.stringify(userAccount)); //user persisted data
    const userData = JSON.parse(localStorage.getItem('userAccount'));
    setUserInfo(userData);
    setIsConnected(true);
  };

我们创建一个函数,它接受三个参数并将信息保存到我们的本地存储中,这样我们就不会在用户不小心刷新浏览器时丢失。最后,使用 useState 内置钩子设置我们的本地状态。

取得了很大的进步,因为即使我们刷新也不会丢失信息,这暂时解决了我们的数据持久性问题。我们现在还需要添加我们的功能来删除从 loacalstorage 存储的信息。

  const onDisconnect = () => {
    window.localStorage.removeItem('userAccount');
    setUserInfo({});
    setIsConnected(false);
  };

在上面的函数中,我们使用了当今所有浏览器都支持的 window 全局对象,并删除了存储在其中的对象和存储的键值。所有的事情都工作正常,但我们有一个问题。

我们连接到 Metamask 并检索钱包信息,但如果我们刷新,我们将丢失 UI 中的信息。为了处理这些信息,我们将使用内置的反应钩子 useEffect 来检查我们是否在窗口全局对象中有这个对象。

 useEffect(() => {
    function checkConnectedWallet() {
      const userData = JSON.parse(localStorage.getItem('userAccount'));
      if (userData != null) {
        setUserInfo(userData);
        setIsConnected(true);
      }
    }
    checkConnectedWallet();
  }, []);

在这里我们检查我们是否已经将密钥存储在本地存储中,如果是,我们将设置我们的本地状态,如果我们没有此信息,我们将返回 void。

我们在本文中介绍了一种一键式、加密安全的登录流程。我们只是触及了表面,Web3 必须为我们提供更多的可能性。文章来源地址https://www.toymoban.com/news/detail-763719.html

到了这里,关于使用 React、Web3.js 和 Metamask 构建 Web3 dApp 身份验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用nodejs和web3js来实现链接MetaMask钱包并取消风险代币授权

    随着区块链技术的快速发展,数字货币资产在投资及交易市场中得到了广泛的应用。而在数字货币交易过程中,钱包是一个非常重要的环节。比如MetaMask就是一款非常流行的区块链钱包,它可以让用户在浏览器中安全地管理自己的数字资产。 然而,在数字货币交易过程中也存

    2024年01月23日
    浏览(50)
  • Web3 React项目Dapp获取智能合约对象

    上文Web3 整理React项目 导入Web3 并获取区块链信息中,我们在react搭建的dapp中简单拿到了我们区块链中的账号授权信息 那 我们继续 先终端运行 将ganache环境起起来 然后 我们运行 dapp 拿到授权列表 回到上文结束的一个状态 然后 我们发布一下自己的智能合约 在我们的项目终端

    2024年02月06日
    浏览(52)
  • web3 在React dapp中全局管理web3当前登录用户/智能合约等信息

    上文 Web3 React项目Dapp获取智能合约对象我们在自己的前端dapp项目中链接获取到了 自己的智能合约 我们继续 我们还是先启动ganache环境 终端输入 然后发布一下我们的智能合约 打开我们的合约项目 终端输入 这样 我们的智能合约就部署到区块链上了 然后 我们启动项目 打开浏

    2024年02月06日
    浏览(48)
  • web3 React dapp中编写balance组件从redux取出并展示用户资产

    好啊 上文WEB3 在 React搭建的Dapp中通过redux全局获取并存储用户ETH与自定义token与交易所存储数量中 我们拿到了用户的一个本身 和 交易所token数量 并放进了redux中做了一个全局管理 然后 我们继续 先 起来ganache的一个模拟环境 然后 我们启动自己的项目 顺手发布一下合约 然后

    2024年02月05日
    浏览(39)
  • 区块链与数字身份:Web3的身份验证革命

    随着数字化时代的发展,个人身份认证在日常生活和商业活动中变得越来越重要。然而,传统的身份认证方式存在着许多问题,如安全性不足、数据泄露、信息篡改等。而区块链技术的出现为数字身份认证带来了全新的解决方案。本文将深入探讨区块链与数字身份的关系,以

    2024年04月16日
    浏览(33)
  • 以太坊Dapp通过web3js部署调用智能合约

    参考视频:https://www.bilibili.com/video/BV14z4y1Z7Jd?p=1 https://remix.ethereum.org/ 创建一个新的文件夹 mkdir MyDapp2 启动 ganache-cli 下载web3 npm install web3 ,注:ganache的启动和deploy.js要在同一个目录。 先进行测试 node deploy.js 部署合约 web3的版本:1.7.1 复制 WEB3DEPLOY 的内容到deploy.js == ganache需要

    2023年04月23日
    浏览(46)
  • 记录分享vue3通过web3.js连接MetaMask的流程及签名、验签方法

    记录下web3.js连接,希望对像我一样的小白有帮助。废话不多说,开整! 一、先在浏览器上面下载 小狐狸MetaMask插件,然后创建账户,创建成功之后默认连接的是以太坊 Ethereum 主网络,如果有相关网络的信息(如RPC URL和和链id等,可以自己添加,没有就先不管)。  二、本地项

    2024年02月06日
    浏览(58)
  • WEB3 创建React前端Dapp环境并整合solidity项目,融合项目结构便捷前端拿取合约 Abi

    好 各位 经过我们上文 WEB3 solidity 带着大家编写测试代码 操作订单 创建/取消/填充操作 我们自己写了一个测试订单业务的脚本 没想到运行的还挺好的 那么 今天开始 我们就可以开始操作我们前端 Dapp 的一个操作了 在整个过程中 确实是没有我们后端的操作 或者说 我们自己就

    2024年02月07日
    浏览(63)
  • web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中

    好 上文web3通过antd 在React dapp中构建订单组件基本结构我们算是把一个基本的订单组件展示做出来了 然后 我们继续 起一下环境先 ganache 终端运行 MetaMask 登录一下 然后 打开项目 发布一下合约 然后 运行一下 测试脚本 转入交易所 ETH和grToken 还创建两个订单 然后 运行起 dapp项

    2024年02月05日
    浏览(49)
  • Web3钱包和身份验证:安全和去中心化的新标准

    在数字化的今天,我们正处于一个互联网技术迅速发展的时代。Web3作为一个革命性的概念,正在逐渐改变我们对互联网的看法和使用习惯。在这一变革中,Web3钱包和身份验证成为了核心组成部分,它们不仅为我们提供了安全和去中心化的解决方案,还重新定义了在线身份、

    2024年04月28日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包