SIWE: Adicionar autenticação Ethereum para Dapp Tutorial de implementação e sugestões de otimização

SIWE: Adicionando capacidade de identificação ao Dapp

SIWE(Entrar com Ethereum) é um método de verificação da identidade do usuário na Ethereum, semelhante à iniciação de transações, provando o controle do usuário sobre a carteira. Atualmente, a maioria dos plugins de carteira suporta este método de autenticação simples, bastando assinar as informações no plugin. Este artigo discutirá cenários de assinatura na Ethereum.

SIWE使用手册:如何让你的Dapp更加强大?

Quando é necessário o SIWE

Se a sua Dapp tiver os seguintes requisitos, pode considerar usar o SWIE:

  • Ter um sistema de utilizadores independente
  • É necessário consultar informações relacionadas à identificação do usuário

Para aplicações baseadas em consultas, como etherscan, o SIWE pode não ser necessário.

Embora a identificação possa ser indicada no front-end através da conexão da carteira, para chamadas de interface que requerem suporte do back-end, apenas passar o endereço não consegue provar a identificação, porque o endereço é uma informação pública.

Manual de Uso do SIWE: Como tornar o seu Dapp mais poderoso?

Princípio e Processo do SIWE

O processo SIWE pode ser resumido em: conectar a carteira - assinar - obter identificação. Os passos específicos são os seguintes:

  1. Conectar carteira: conectar a carteira no Dapp através do plugin da carteira.

  2. Assinatura:

    • Obter o valor de Nonce: chamar a interface de backend para obter um valor de Nonce aleatório.
    • Construir conteúdo da assinatura: inclui valor Nonce, nome de domínio, ID da cadeia, etc.
    • Usar o método de assinatura de carteira para assinar o conteúdo.
    • Enviar a assinatura para o backend.
  3. Obter identificação:

    • Após a verificação da assinatura no backend, retorna a identificação do usuário ( como JWT ).
    • Os pedidos subsequentes devem incluir o endereço e a identificação, comprovando a propriedade da carteira.

Manual de Uso do SIWE: Como tornar seu Dapp mais poderoso?

Prática SIWE

Vamos desenvolver um Dapp que suporte SIWE usando Next.js, com o objetivo de retornar um JWT para a verificação da identificação do usuário.

trabalho de preparação

  1. Instalar o Next.js:

npx create-next-app@14

  1. Instalar dependências relacionadas ao SIWE:

npm install antd @ant-design/web3 @ant-design/web3-wagmi wagmi viem @tanstack/react-query --save

implementação do SIWE

  1. Importar WagmiProvider em layout.tsx:

javascript "use client"; import { getNonce, verifyMessage } from "@/app/api"; importar { Mainnet, MetaMask, OkxWallet, TokenPocket, WagmiWeb3ConfigProvider, WalletConnect, } de "@ant-design/web3-wagmi"; import { QueryClient } from "@tanstack/react-query"; importar React de "react"; import { createSiweMessage } from "viem/siwe"; import { http } from "wagmi"; import { JwtProvider } from "./JwtProvider";

const YOUR_WALLET_CONNECT_PROJECT_ID = "c07c0051c2055890eade3556618e38a6"; const queryClient = new QueryClient();

const WagmiProvider: React.FC = ({ children }) => { const [jwt, setJwt] = React.useState(null);

return ( <wagmiweb3configprovider siwe="{{" getnonce:="" async="" (address)=""> (await getNonce(address)).data, createMessage: (props) => { return createSiweMessage({ ...props, statement: "Ant Design Web3" }); }, verifyMessage: async (message, signature) => { const jwt = (await verifyMessage(message, signature)).data; setJwt(jwt); return !!jwt; }, }} chains={[Mainnet]} transports={{ [Mainnet.id]: http(), }} walletConnect={{ projectId: YOUR_WALLET_CONNECT_PROJECT_ID, }} wallets={[} MetaMask(), WalletConnect(), TokenPocket({ grupo: "Popular", }), OkxWallet(), ]} queryClient={queryClient} > {children} ); };

export default WagmiProvider;

Manual de Utilização do SIWE: Como tornar o seu Dapp mais poderoso?

  1. Adicionar botão de conexão:

javascript "use client"; import type { Account } from "@ant-design/web3"; import { ConnectButton, Connector } from "@ant-design/web3"; import { Flex, Space } from "antd"; importar React de "react"; import { JwtProvider } from "./JwtProvider";

exportar função padrão App() { const jwt = React.useContext(JwtProvider);

const renderSignBtnText = ( defaultDom: React.ReactNode, conta?: Conta ) => { const { address } = account ?? {}; const ellipsisAddress = address ? ${address.slice(0, 6)}...${address.slice(-6)} : ""; retornar Iniciar sessão como ${ellipsisAddress}; };

return ( <> {jwt} ); }

Manual de Uso do SIWE: Como tornar seu Dapp mais poderoso?

implementação da interface

  1. Interface Nonce:

javascript import { randomBytes } from "crypto"; import { addressMap } from "../cache";

export async function GET(request: Request) { const { searchParams } = new URL(request.url); const address = searchParams.get("address");

se (!endereço) { throw new Error("Endereço inválido"); } const nonce = randomBytes(16).toString("hex"); addressMap.set(address, nonce); return Response.json({ dados: nonce, }); }

  1. Interface de verificação de mensagens:

javascript import { createPublicClient, http } from "viem"; import { mainnet } from "viem/chains"; import jwt from "jsonwebtoken"; import { parseSiweMessage } from "viem/siwe"; import { addressMap } from "../cache";

const JWT_SECRET = "your-secret-key";

const publicClient = createPublicClient({ cadeia: mainnet, transporte: http(), });

export async function POST(request: Request) { const { signature, message } = await request.json();

const { nonce, address = "0x" } = parseSiweMessage(message);

se (!nonce || nonce !== addressMap.get(endereço)) { throw new Error("Nonce inválido"); }

const valid = await publicClient.verifySiweMessage({ mensagem, endereço, assinatura, });

se (!valid) { throw new Error("Assinatura inválida"); }

const token = jwt.sign({ address }, JWT_SECRET, { expiresIn: "1h" }); return Response.json({ dados: token, }); }

Manual de Utilização do SIWE: Como tornar a sua Dapp mais poderosa?

Sugestões de otimização

Para aumentar a velocidade de verificação de login SIWE, recomenda-se usar um serviço de nó dedicado. Pode usar o serviço de nó ZAN, substituindo o RPC padrão do publicClient:

javascript const publicClient = createPublicClient({ cadeia: mainnet, transporte: http('), //Serviço RPC do nó ZAN });

Isto pode reduzir significativamente o tempo de validação e melhorar a velocidade de resposta da interface.

Manual de uso do SIWE: como tornar seu Dapp mais poderoso?

DAPP-0.12%
ETH2.89%
Ver original
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
  • Recompensa
  • 3
  • Compartilhar
Comentário
0/400
MEVHunterLuckyvip
· 9h atrás
Assina e assina, ainda faz tanta frescura.
Ver originalResponder0
OfflineValidatorvip
· 9h atrás
Assinar vai e vem, é melhor ir diretamente para a torre de controle.
Ver originalResponder0
SchroedingerMinervip
· 10h atrás
A verificação da armadilha de assinatura é bastante confiável.
Ver originalResponder0
  • Marcar
Faça trade de criptomoedas em qualquer lugar e a qualquer hora
qrCode
Escaneie o código para baixar o app da Gate
Comunidade
Português (Brasil)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)