Guia de Integração SIWE: Melhorar a Verificação de Identificação do Usuário Dapp

Guia de Uso do SIWE: Melhore as Funcionalidades da Sua Dapp

SIWE (Sign-In with Ethereum) é uma forma de verificar a identidade do usuário na Ethereum, semelhante a iniciar uma transação, provando o controle do usuário sobre a carteira. Atualmente, a maioria dos plugins de carteira suporta essa forma simples de autenticação, que só requer uma assinatura no plugin.

Este artigo discute principalmente os cenários de assinatura na Ethereum, não envolvendo outras blockchains públicas como Solana, SUI, etc.

Manual de Uso do SIWE: Como Tornar seu Dapp Mais Poderoso?

O seu projeto precisa de SIWE?

Se a sua Dapp tiver as seguintes necessidades, pode considerar usar o SIWE:

  • Ter o seu próprio sistema de utilizadores
  • É necessário consultar informações relacionadas à privacidade do usuário

Mas se o seu Dapp é principalmente uma funcionalidade de consulta, semelhante ao etherscan, então você pode não usar o SIWE.

Você pode perguntar, ao conectar a carteira no Dapp, isso não indica a propriedade da carteira? Essa afirmação não é totalmente precisa. Para o front-end, conectar a carteira realmente indica a identidade, mas para chamadas de interface que precisam de suporte de back-end, apenas passar o endereço não é suficiente para provar a identidade, pois o endereço é uma informação pública que qualquer um pode usar.

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

O princípio e o processo do SIWE

O processo do SIWE pode ser resumido em três etapas: conectar a carteira, assinar, obter a identificação de identidade.

Conectar carteira

Esta é uma operação comum do Web3, conectando a carteira na Dapp através do plugin da carteira.

assinatura

Os passos de assinatura do SIWE incluem obter o valor Nonce, assinatura da carteira e verificação da assinatura no backend.

Para obter o valor Nonce, é necessário chamar a interface de backend. O backend gera um valor Nonce aleatório e o associa ao endereço atual, preparando-se para a assinatura subsequente.

Após obter o valor Nonce no front-end, construa o conteúdo da assinatura, incluindo o valor Nonce, o nome de domínio, o ID da cadeia e o conteúdo da assinatura, normalmente utilizando o método fornecido pela carteira para assinar.

Após construir a assinatura, envie-a para o backend.

Obter identificação

Após a verificação da assinatura no backend, retorna-se a identificação do usuário, como JWT. O frontend, em requisições subsequentes, deve incluir o endereço e a identificação do usuário, para provar a propriedade da carteira.

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

Prática

Vamos desenvolver uma aplicação full stack com Next.js, integrando a funcionalidade SIWE. Note que esta demonstração serve apenas para mostrar o fluxo básico e não é adequada para uso em ambiente de produção.

trabalho de preparação

Certifique-se de que o ambiente Node.js está instalado.

Instalar dependências

Primeiro, instale o Next.js:

npx create-next-app@14

Siga as instruções para concluir a instalação.

Entre no diretório do projeto, execute o projeto:

npm run dev

Aceder a localhost:3000 permite ver um projeto básico de Next.js.

Instalar dependências relacionadas ao SIWE

Escolhemos usar o Ant Design Web3, porque é gratuito, mantido continuamente, tem uma boa experiência de uso e suporta SIWE.

Instalar dependências:

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

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

Introduzir Wagmi

Importar o Provider relevante no layout.tsx:

typescript "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 siweconfig="{{" getnonce:="" async="" (address)=""> (aguardar getNonce(endereço)).dados, createMessage: (props) => { return createSiweMessage({ ...props, statement: "Ant Design Web3" }); }, verifyMessage: async (mensagem, assinatura) => { 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;

Adicionar botão de conectar carteira:

typescript "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";

export default function 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 Entrar como ${ellipsisAddress}; };

return ( <>

JWT: {jwt}
); }

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

implementação da interface

Nonce

Gerar Nonce aleatório e associá-lo ao endereço:

typescript 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(endereço, nonce); return Response.json({ dados: nonce, }); }

verificarMensagem

Validar a assinatura e retornar o JWT:

typescript 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(address)) { 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 uso do SIWE: como tornar sua Dapp mais poderosa?

Sugestões de otimização

Para aumentar a velocidade de verificação, recomenda-se o uso de serviços de nó especializados. Você pode usar o serviço de nó da ZAN, obter a conexão RPC e substituir o RPC padrão no código.

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

Isso pode aumentar significativamente a velocidade de resposta da interface.

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

Ver original
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
  • Recompensa
  • 5
  • Partilhar
Comentar
0/400
GateUser-5854de8bvip
· 17h atrás
Acabei de ouvir e entendi mais ou menos.
Ver originalResponder0
GateUser-40edb63bvip
· 17h atrás
As coisas que o governo está fazendo estão cada vez mais complicadas.
Ver originalResponder0
Blockwatcher9000vip
· 17h atrás
Essa questão não foi resolvida com o Metamask?
Ver originalResponder0
WenAirdropvip
· 17h atrás
É mais fácil usar web2 do que configurar siwe.
Ver originalResponder0
GreenCandleCollectorvip
· 18h atrás
Para que serve assinar e coisas assim? Quando as coisas não vão bem, é só vender~
Ver originalResponder0
  • Pino
Negocie cripto em qualquer lugar e a qualquer hora
qrCode
Digitalizar para transferir a aplicação Gate
Novidades
Português (Portugal)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)