Panduan Teknik SIWE: Membangun Sistem Autentikasi Identitas Ethereum untuk Dapp

Panduan Implementasi Teknologi SIWE: Membangun Sistem Verifikasi Identitas Dapp yang Kuat

SIWE(Masuk dengan Ethereum) adalah cara untuk memverifikasi identitas pengguna di Ethereum, mirip dengan memulai transaksi, untuk membuktikan kontrol pengguna atas dompet. Saat ini, plugin dompet utama mendukung metode otentikasi identitas sederhana ini, cukup dengan menandatangani di dalam plugin.

Artikel ini terutama membahas skenario tanda tangan di Ethereum, tidak melibatkan blockchain publik lainnya.

Kapan perlu menggunakan SIWE

Jika Dapp Anda memiliki kebutuhan berikut, Anda dapat mempertimbangkan untuk menggunakan SIWE:

  • Memiliki sistem pengguna yang independen
  • Perlu mencari informasi yang terkait dengan identifikasi pengguna

Untuk aplikasi yang berfokus pada pencarian, seperti penjelajah blok seperti etherscan, maka SIWE tidak perlu digunakan.

Meskipun setelah menghubungkan dompet di frontend Dapp tampaknya sudah membuktikan identitas, namun untuk pemanggilan antarmuka yang memerlukan dukungan backend, hanya mentransmisikan alamat tidaklah cukup, karena alamat adalah informasi publik dan mudah disalahgunakan.

SIWE menggunakan panduan: Bagaimana membuat Dapp Anda lebih kuat?

Prinsip dan Proses SIWE

Proses SIWE dapat dirangkum dalam tiga langkah: menghubungkan dompet, menandatangani, mendapatkan identifikasi.

sambungkan dompet

Ini adalah operasi Web3 yang umum, menghubungkan dompet di Dapp melalui plugin dompet.

tanda tangan

Termasuk tiga langkah: mendapatkan nilai Nonce, tanda tangan dompet, dan verifikasi tanda tangan backend.

  1. Mendapatkan nilai Nonce yang dihasilkan secara acak dari backend, yang terkait dengan alamat saat ini.

  2. Membangun konten tanda tangan di frontend, termasuk nilai Nonce, nama domain, ID rantai, dan informasi lainnya, menggunakan metode yang disediakan oleh dompet untuk menandatangani.

  3. Kirim tanda tangan ke backend untuk verifikasi.

mendapatkan identifikasi

Setelah verifikasi tanda tangan di backend berhasil, kembalikan identifikasi pengguna ( seperti JWT). Permintaan selanjutnya di frontend harus menyertakan alamat dan identifikasi, untuk membuktikan kepemilikan dompet.

SIWE Penggunaan Manual: Bagaimana membuat Dapp Anda lebih kuat?

Panduan Praktik

Berikut ini akan dijelaskan bagaimana cara mengimplementasikan fungsi SIWE dalam proyek Nextjs, mengembalikan JWT untuk identifikasi.

persiapan lingkungan

  1. Instal Nextjs:

npx create-next-app@14

  1. Instal dependensi terkait SIWE:

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

SIWE menggunakan manual: Bagaimana membuat Dapp Anda lebih kuat?

memperkenalkan Wagmi

Mengimpor WagmiProvider di layout.tsx:

javascript "gunakan klien"; import { getNonce, verifyMessage } dari "@/app/api"; import { Mainnet, MetaMask, OkxWallet, TokenPocket, WagmiWeb3ConfigProvider, WalletConnect, } dari "@ant-design/web3-wagmi"; import { QueryClient } from "@tanstack/react-query"; import React from "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);

kembali ( <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, }} dompet={[ MetaMask(), WalletConnect(), TokenPocket({ grup: "Populer", }), OkxWallet(), ]} queryClient={queryClient} > {children} ); };

ekspor default WagmiProvider;

SIWE Penggunaan Manual: Bagaimana membuat Dapp Anda lebih kuat?

Tambahkan tombol koneksi

Tambahkan tombol sambungkan dompet dan tanda tangan di komponen:

javascript "gunakan klien"; import type { Account } from "@ant-design/web3"; import { ConnectButton, Connector } from "@ant-design/web3"; import { Flex, Space } from "antd"; import React dari "react"; import { JwtProvider } from "./JwtProvider";

ekspor default fungsi App() { const jwt = React.useContext(JwtProvider);

const renderSignBtnText = ( defaultDom: React.ReactNode, akun?: Akun ) => { const { alamat } = akun ?? {}; const ellipsisAddress = address ? ${address.slice(0, 6)}...${address.slice(-6)} : ""; kembali Masuk sebagai ${ellipsisAddress}; };

return ( <>

JWT: {jwt}
); }

SIWE menggunakan manual: Bagaimana membuat Dapp Anda lebih kuat?

implementasi antarmuka

Antarmuka Nonce

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

ekspor async fungsi GET(permintaan: Permintaan) { const { searchParams } = new URL(request.url); const address = searchParams.get("address");

jika (!address) { throw new Error("Alamat tidak valid"); } const nonce = randomBytes(16).toString("hex"); addressMap.set(address, nonce); return Response.json({ data: nonce, }); }

Antarmuka Verifikasi Tanda Tangan

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

const JWT_SECRET = "your-secret-key";

const publicClient = createPublicClient({ rantai: mainnet, transport: http(), });

ekspor async fungsi POST(permintaan: Permintaan) { const { signature, message } = await request.json();

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

jika (!nonce || nonce !== addressMap.get(address)) { throw new Error("Nonce tidak valid"); }

const valid = await publicClient.verifySiweMessage({ pesan, alamat, tanda tangan, });

jika (!valid) { throw new Error("Tanda tangan tidak valid"); }

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

SIWE menggunakan manual: bagaimana membuat Dapp Anda lebih kuat?

Saran Optimasi

Untuk meningkatkan kecepatan login SIWE, disarankan untuk menggunakan layanan node khusus. Sebagai contoh layanan node ZAN, setelah mendapatkan koneksi HTTPS RPC untuk jaringan utama Ethereum, ganti RPC default dari publicClient:

javascript const publicClient = createPublicClient({ rantai: mainnet, transport: http('), //Layanan RPC node ZAN });

Ini dapat secara signifikan mengurangi waktu verifikasi dan meningkatkan kecepatan respons antarmuka.

SIWE menggunakan manual: bagaimana membuat Dapp Anda lebih kuat?

Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
  • Hadiah
  • 5
  • Bagikan
Komentar
0/400
MrRightClickvip
· 07-16 07:52
Tanda tangan saja sudah cukup, tidak perlu begitu rumit.
Lihat AsliBalas0
BearMarketSurvivorvip
· 07-16 03:02
Sekali lagi membuat barang yang megah seperti ini
Lihat AsliBalas0
SpeakWithHatOnvip
· 07-13 20:00
Dengan tingkat verifikasi seperti ini, jebakan saja bisa lolos.
Lihat AsliBalas0
NFTDreamervip
· 07-13 19:58
Apa yang perlu diributkan, langsung saja selesai.
Lihat AsliBalas0
BlockTalkvip
· 07-13 19:57
Mengapa verifikasi identifikasi begitu merepotkan?
Lihat AsliBalas0
  • Sematkan
Perdagangkan Kripto Di Mana Saja Kapan Saja
qrCode
Pindai untuk mengunduh aplikasi Gate
Komunitas
Bahasa Indonesia
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)