SIWE:イーサリアムログイン新標準実践ガイド

SIWE:イーサリアムログインの強大なツール

SIWE (イーサリアムでサインイン)は、エーテル上でユーザーのアイデンティティを検証する方法です。取引を開始するのと同様に、ユーザーがウォレットを制御していることを証明するために署名を使用します。現在、ほとんどの主流のウォレットプラグインは、このシンプルな認証方法をサポートしています。

本文は主にイーサリアム上の署名シーンについて議論し、SolanaやSUIなどの他のパブリックチェーンについては触れません。

! SIWEマニュアル:Dappをより強力にする方法は?

いつ SIWE が必要ですか?

もしあなたのDappが以下の要件を持っている場合、SIWEの使用を検討することができます:

  • 独立したユーザーシステムを持つ
  • ユーザーのプライバシーに関連する情報を確認する必要があります

主にクエリ機能を提供するDapp(、例えばブロックエクスプローラー)には、SIWEは必要ないかもしれません。

フロントエンドでのアイデンティティを証明するためにウォレット接続を使用することはできますが、バックエンドサポートが必要なAPI呼び出しにおいて、アドレスを渡すだけでは不十分です。なぜなら、アドレスは公開情報であり、誰でも使用できるからです。

! SIWEマニュアル:Dappをより強力にする方法は?

SIWEの原理とプロセス

SIWEのプロセスは、3つのステップで要約できます: ウォレットに接続 - サイン - 身分証明を取得。

ウォレットに接続する

これは Web3 アプリケーションで一般的な操作であり、ウォレットプラグインを通じてユーザーのウォレットに接続します。

サイン

署名手順には、Nonce 値の取得、ウォレット署名、およびバックエンド署名検証が含まれます。

まず、バックエンドからランダムに生成されたNonce値を取得します。バックエンドはそれを現在のアドレスに関連付けます。

フロントエンドがNonce値を取得した後、Nonce、ドメイン名、チェーンIDなどの情報を含む署名内容を構築し、その後ウォレットの署名方法を使用して署名します。

最後に、署名をバックエンドに送信して検証します。

ID を取得する

バックエンドで署名の検証が通過した後、ユーザーのID(がJWT)として返されます。フロントエンドのその後のリクエストでは、アドレスとIDを持参し、ウォレットの所有権を証明できます。

! SIWEマニュアル:Dappをより強力にする方法は?

SIWEの実践

次に、簡単なデモを通じてSIWEの基本プロセスを実践します。目標は、Dappが身分確認のためのJWTを返すことです。

注意:このデモは基本的なプロセスを示すためのものであり、運用環境での使用には安全上のリスクがある可能性があります。

###の準備

私たちは Next.js を使用してフルスタックアプリケーションを開発しており、Node.js 環境を準備する必要があります。

依存関係をインストールする

まず Next.js をインストールします:

npx create-next-app@14

指示に従ってインストールを完了してください。

プロジェクトディレクトリに入って起動:

npm run dev

localhost:3000 にアクセスすると、基本的な Next.js プロジェクトを見ることができます。

SIWEに関連する依存関係をインストール

私たちは Ant Design Web3 を使用してウォレットに接続し、SIWE 機能を実現します:

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

! SIWEマニュアル:Dappをより強力にする方法は?

ワグミのご紹介

layout.tsx での WagmiProvider の紹介:

JSXの "クライアントを使用する"; import { getNonce, verifyMessage } from "@/app/api"; インポート{ メインネット、 メタマスク Okxウォレット、 トークンポケット、 WagmiWeb3ConfigProvider、 ウォレットコネクト、 } から "@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 = 新しいQueryClient();

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

リターン( <wagmiweb3configprovider siwe="{{" getnonce:="" async="" (address)=""> (await getNonce(address)).data, createMessage: (props) => { 戻り値 createSiweMessage({ ... props, statement: "Ant Design Web3" }); }, verifyMessage:非同期(message、signature) = > { const jwt = (await verifyMessage(message、signature)).data; setJwt(jwt); 帰る!! JWTの; }, }} chains={[Mainnet]} transports={{ [Mainnet.id]:http()、 }} walletConnect={{ projectId: YOUR_WALLET_CONNECT_PROJECT_ID、 }} wallets={[ MetaMask()、 WalletConnect()、 TokenPocket({ グループ: "人気", }), OkxWallet()、 ]} queryClient={クエリクライアント} > {子供} ); };

export default WagmiProvider;

次に、ウォレット接続ボタンを追加します:

JSXの "クライアントを使用する"; import type { Account } from "@ant-design/web3"; import { ConnectButton, Connector } from "@ant-design/web3"; import { Flex, Space } from "antd"; import React from "react"; import { JwtProvider } from "./JwtProvider";

export default 関数 App() { const jwt = React.useContext(JwtProvider);

const renderSignBtnText = ( defaultDom: React.ReactNode, アカウント?: アカウント ) => { const { アドレス } = アカウント ?? {}; const ellipsisAddress = アドレス ? ${address.slice(0, 6)}...${address.slice(-6)} : ""; ${ellipsisAddress}としてログインします; };

リターン( <>

JWT: {jwt}
); }

これで基本的な SIWE ログインフレームワークが実現しました。

! SIWEマニュアル:Dappをより強力にする方法は?

インターフェース実装

現在、バックエンドに必要なインターフェースのいくつかを実装します。

ノンス

ランダムなNonceを生成し、アドレスに関連付ける:

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

非同期関数のエクスポート GET(request: Request) { const { searchParams } = 新しいURL(request.url); constアドレス= searchParams.get("アドレス");

if (!address) { 新しいError("無効なアドレス")をスローします。 } const nonce = randomBytes(16).toString("hex"); addressMap.set(住所、nonce); 戻り値 Response.json({ データ: ノンス, }); }

メッセージを確認する

署名を検証し、JWTを返します:

JavaScriptの import { createPublicClient, http } from "viem"; import { mainnet } from "viem/chains"; jwtを"jsonwebtoken"からインポートする; import { parseSiweMessage } from "viem/siwe"; import { addressMap } from ".. /cache";

const JWT_SECRET = "あなたの秘密鍵"; より安全なキーを使用し、対応する有効期限チェックを追加します

const publicClient = createPublicClient({ チェーン: メインネット, トランスポート:http()、 });

export async 関数 POST(request: Request) { const {署名、メッセージ} = await request.json();

const { nonce, アドレス = "0x" } = parseSiweMessage(message);

if (!nonce || nonce !== addressMap.get(アドレス)) { 新しいError("無効なナンス")をスローします。 }

const valid = await publicClient.verifySiweMessage({ メッセージ、 アドレス、 シグネチャー、 });

if (!valid) { 新しいError("無効な署名")をスローします。 }

const token = jwt.sign({ アドレス }, JWT_SECRET, { expiresIn: "1h" }); 戻り値 Response.json({ データ: トークン, }); }

これで、基本的な SIWE ログイン Dapp が開発完了しました。

! SIWEマニュアル:Dappをより強力にする方法は?

パフォーマンス最適化

検証速度を向上させるために、専用のノードサービスの使用をお勧めします。ここでは、ZANのノードサービスを使用し、publicClientのデフォルトRPCを置き換えます:

JavaScriptの const publicClient = createPublicClient({ チェーン: メインネット, transport: http('), //取得した ZAN ノードサービス RPC に置き換えてください });

これにより、検証時間を大幅に短縮し、インターフェースの速度を向上させることができます。

! SIWEマニュアル:Dappをより強力にする方法は?

ETH0.09%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 7
  • 共有
コメント
0/400
ImpermanentPhilosophervip
· 07-25 02:45
この署名はまたethの特許です。
原文表示返信0
SignatureCollectorvip
· 07-24 06:01
署名検証のことは、早く手配するべきでしたね。
原文表示返信0
StableGeniusDegenvip
· 07-24 06:00
私は長い間これで遊んでみたいと思っていました、そしてすべての主要な財布はそれをサポートしています
原文表示返信0
ConfusedWhalevip
· 07-24 05:58
ベア・マーケットはもう少し冷静に新しいものを作れますか
原文表示返信0
Lonely_Validatorvip
· 07-24 05:57
ETH特有の確認はそうですね、老复杂でした。
原文表示返信0
MevHuntervip
· 07-24 05:48
Solanaも理解しなければならない!
原文表示返信0
NewDAOdreamervip
· 07-24 05:39
ウォレットの検証がめちゃくちゃ楽しい
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)