You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何安装并使用eth-auth(ethauth-server)库?含库的定义与用途咨询

eth-auth 是什么?

eth-auth 是一套基于以太坊区块链的身份验证工具集,核心逻辑是利用以太坊钱包的数字签名能力完成用户身份校验,无需依赖传统的用户名密码体系。它的核心思路是:服务器生成随机挑战字符串,用户用自己的以太坊钱包对该字符串签名,服务器通过验证签名有效性,确认用户是对应钱包地址的合法持有者。

主要用途

  • 去中心化身份验证:让用户直接用MetaMask、Trust Wallet等以太坊钱包登录应用,彻底规避密码泄露、撞库等安全风险
  • Web3应用身份校验:为去中心化应用(DApp)、链上服务提供用户身份验证能力,确保操作请求确实来自钱包的合法持有者
  • 无密码登录扩展:给传统Web应用添加Web3登录选项,提升用户登录体验的同时增强账号安全性
  • 链上操作授权:验证用户身份后,授权执行特定链上操作(比如签署交易、调用智能合约方法)

Node.js 项目中安装 ethauth-server

在项目根目录执行以下命令完成安装:

npm install ethauth-server
# 若使用Yarn包管理器
yarn add ethauth-server

使用 ethauth-server 的基本流程

1. 初始化服务器实例

结合Express框架初始化ethauth-server:

const express = require('express');
const { EthAuthServer } = require('ethauth-server');
const app = express();

// 初始化EthAuthServer,可配置签名过期时间等参数
const ethAuth = new EthAuthServer({
  signatureExpiry: 3600 // 签名有效期,单位秒,默认3600
});

// 解析JSON请求体
app.use(express.json());

2. 生成登录挑战

给前端提供接口,根据用户的钱包地址生成唯一的挑战字符串:

app.get('/api/auth/challenge', (req, res) => {
  const { address } = req.query;
  if (!address) {
    return res.status(400).json({ error: '钱包地址不能为空' });
  }
  const challenge = ethAuth.generateChallenge(address);
  res.json({ challenge });
});

3. 验证签名并返回凭证

前端拿到挑战并签名后,提交签名信息到服务器验证,验证通过后返回自定义身份凭证(如JWT):

app.post('/api/auth/verify', async (req, res) => {
  const { address, challenge, signature } = req.body;
  try {
    // 验证签名的有效性
    const isValid = await ethAuth.verifySignature(address, challenge, signature);
    if (!isValid) {
      return res.status(401).json({ error: '签名验证失败' });
    }
    // 验证通过后,生成并返回自定义会话凭证(示例用JWT,需自行实现JWT生成逻辑)
    const authToken = 'your-generated-jwt-token';
    res.json({ success: true, token: authToken });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 启动服务器
app.listen(3000, () => {
  console.log('服务器运行在 http://localhost:3000');
});

4. 前端配合示例

前端需要调用挑战接口,使用钱包签名后提交验证(以ethers.js和MetaMask为例):

import { ethers } from 'ethers';

async function web3Login() {
  // 连接MetaMask钱包
  const provider = new ethers.providers.Web3Provider(window.ethereum);
  await provider.send('eth_requestAccounts', []);
  const signer = provider.getSigner();
  const address = await signer.getAddress();

  // 获取服务器生成的挑战字符串
  const challengeResp = await fetch(`/api/auth/challenge?address=${address}`);
  const { challenge } = await challengeResp.json();

  // 使用钱包对挑战字符串签名
  const signature = await signer.signMessage(challenge);

  // 提交签名信息到服务器验证
  const verifyResp = await fetch('/api/auth/verify', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ address, challenge, signature })
  });
  const result = await verifyResp.json();
  
  if (result.success) {
    // 存储身份凭证,用于后续请求鉴权
    localStorage.setItem('web3AuthToken', result.token);
    console.log('登录成功');
  }
}

内容的提问来源于stack exchange,提问作者Sathnindu Kottage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:35:15