如何安装并使用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
相关产品推荐
相关产品推荐

