SIWE: نموذج جديد للتحقق من الهوية في إثيريوم لتحسين تجربة مستخدمي Dapp

SIWE: أداة قوية لتعزيز تحقق الهوية في Dapp

SIWE(تسجيل الدخول باستخدام إيثيريوم) هي طريقة للتحقق من هوية المستخدم على إيثيريوم، مشابهة لبدء المعاملات، لإثبات سيطرة المستخدم على المحفظة. حاليًا، تدعم معظم إضافات المحافظ الرئيسية هذه الطريقة البسيطة للتحقق من الهوية، حيث يكفي التوقيع على المعلومات داخل الإضافة.

سيركز هذا المقال على سيناريوهات التوقيع على إيثيريوم، دون التطرق إلى سلاسل الكتل العامة الأخرى مثل سولانا وSUI.

دليل استخدام SIWE: كيف تجعل Dapp الخاص بك أكثر قوة؟

متى تحتاج إلى استخدام SIWE?

إذا كان لديك Dapp يحتوي على المتطلبات التالية، يمكنك التفكير في استخدام SIWE:

  • وجود نظام مستخدم مستقل
  • تحتاج إلى الاستفسار عن المعلومات المتعلقة بخصوصية المستخدم

بالنسبة لتطبيق Dapp( الذي يقدم بشكل رئيسي وظيفة الاستعلام مثل مستعرض الكتل )، يمكن عدم استخدام التعريف بالهوية.

على الرغم من أنه يبدو أن الهوية قد تم إثباتها بعد الاتصال بالمحفظة على Dapp، إلا أن هذا ينجح فقط في الواجهة الأمامية. بالنسبة لاستدعاءات واجهات برمجة التطبيقات التي تتطلب دعمًا من الخلفية، فإن مجرد تمرير العنوان غير كافٍ، لأن العنوان هو معلومات عامة، وسهل انتحالها.

مبدأ SIWE وعملية

يمكن تلخيص عملية SIWE في ثلاث خطوات: ربط المحفظة - التوقيع - الحصول على التعريف بالهوية. دعونا نتعرف على هذه الخطوات الثلاث بتفصيل.

دليل استخدام SIWE: كيف تجعل تطبيق Dapp الخاص بك أقوى؟

ربط المحفظة

هذا هو إجراء شائع في Web3، حيث يتم توصيل محفظة المستخدم في Dapp من خلال ملحق المحفظة.

توقيع

تتضمن خطوات توقيع SIWE الحصول على قيمة Nonce، وتوقيع المحفظة والتحقق من توقيع الخلفية.

أولاً، تحتاج إلى استدعاء واجهة برمجة التطبيقات الخلفية للحصول على قيمة Nonce. ستقوم الخلفية بإنشاء Nonce عشوائي وربطه بعنوانك الحالي، وذلك للتحضير للتوقيع في المستقبل.

بعد أن تحصل الواجهة الأمامية على قيمة Nonce، يتم بناء محتوى التوقيع، والذي عادة ما يتضمن قيمة Nonce، واسم النطاق، ورقم تعريف السلسلة، ومحتوى التوقيع وغيرها. ثم يتم استخدام الطريقة التي توفرها المحفظة لتوقيع المحتوى.

أخيرًا، أرسل التوقيع إلى الخلفية للتحقق.

الحصول على التعريف بالهوية

بعد التحقق من صحة توقيع الواجهة الخلفية، سيتم إرجاع معرف هوية المستخدم، مثل JWT. عند تقديم الطلبات اللاحقة من الواجهة الأمامية، يجب تضمين العنوان ومعرف الهوية، مما يثبت ملكية المحفظة.

ممارسة SIWE

سوف نستخدم Next.js لتطوير تطبيق SIWE بسيط، والهدف هو جعل Dapp قادرة على إعادة JWT لاستخدامه في التعريف بالهوية. لاحظ أن هذا العرض التقديمي يستخدم فقط لتقديم العملية الأساسية، وقد توجد مخاطر أمنية في بيئة الإنتاج.

الأعمال التحضيرية

نحتاج إلى إعداد بيئة Node.js واستخدام Next.js لتطوير مشروع كامل المكدس.

تثبيت الاعتماديات

أولاً قم بتثبيت Next.js:

npx create-next-app@14

بعد إكمال التثبيت وفقًا للتعليمات، انتقل إلى دليل المشروع وقم بتشغيل:

npm تشغيل dev

يمكنك زيارة localhost:3000 لرؤية مشروع Next.js الأساسي.

دليل استخدام SIWE: كيف تجعل تطبيقك اللامركزي أكثر قوة؟

تثبيت الاعتماديات المتعلقة بـ SIWE

سنستخدم Ant Design Web3، وهو مجاني، ويستمر في الصيانة، وتجربة الاستخدام مشابهة لمكتبة المكونات العادية، ويدعم SIWE. أوامر التثبيت كما يلي:

npm تثبيت antd @ant-design/web3 @ant-design/web3-wagmi wagmi viem @tanstack/react-query --save

إدخال Wagmi

قدم WagmiProvider في layout.tsx:

جافا سكريبت "استخدام العميل"؛ import { getNonce, verifyMessage } من "@/app/api"; استيراد { الشبكة الرئيسية، ميتاماسك, محفظة Okx, توكنبوكيت, WagmiWeb3ConfigProvider, WalletConnect، } من "@ant-design/web3-wagmi"; import { QueryClient } من "@tanstack/react-query" ؛ استيراد React من "react"؛ import { createSiweMessage } من "viem / siwe" ؛ استيراد { http } من "wagmi"; استيراد { JwtProvider } من "./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( { ... الدعائم ، بيان: "Ant Design Web3" }); }, verifyMessage: (message غير متزامن، signature) = > { const jwt = (await verifyMessage(message, signature)).data; setJwt(jwt). أعاد!! JWT. }, }} السلاسل = {[Mainnet]} transports={{ [Mainnet.id]: http()، }} walletConnect={{ معرف المشروع: YOUR_WALLET_CONNECT_PROJECT_ID ، }} المحافظ={[ MetaMask()، WalletConnect()، TokenPocket({ المجموعة: "شائع", }), OkxWallet()، ]} queryClient={queryClient} > {أطفال} ); };

تصدير افتراضي WagmiProvider;

دليل استخدام SIWE: كيف تجعل Dapp الخاص بك أقوى؟

ثم أضف زر ربط المحفظة:

جافا سكريبت "استخدم العميل"; استيراد النوع { الحساب } من "@ant-design/web3"; استيراد { ConnectButton ، Connector } من "@ant-design / web3" ؛ استيراد { Flex, Space } من "antd"; استيراد React من "react"; استيراد { JwtProvider } من "./JwtProvider" ؛

تصدير وظيفة افتراضية App() { const jwt = React.useContext(JwtProvider);

const renderSignBtnText = ( defaultDom: React.ReactNode ، الحساب؟: حساب ) => { const { address } = حساب ؟؟ {}; const ellipsisAddress = العنوان ? ${address.slice(0, 6)}...${address.slice(-6)} : ""; عودة تسجيل الدخول كـ ${ellipsisAddress}; };

( الإرجاع <> <flex vertical="" فجوة ="كبير">

{JWT}
); }

إلى هنا، لقد قمنا بتنفيذ إطار تسجيل الدخول الأساسي SIWE.

دليل استخدام SIWE: كيف تجعل Dapp الخاص بك أقوى؟

تنفيذ الواجهة

الآن سنقوم بتنفيذ واجهة التحقق من هوية المستخدم في الجزء الخلفي.

نونس

يستخدم Nonce لزيادة موثوقية التوقيع. نقوم بإنشاء سلسلة عشوائية ونعمل على ربطها بالعنوان:

جافا سكريبت استيراد { randomBytes } من "التشفير" ؛ استيراد { addressMap } من "../cache";

تصدير الدالة غير المتزامنة GET(request: Request) { const { searchParams } = عنوان URL الجديد(request.url); const address = searchParams.get( "address");

إذا (!address) { throw new Error("عنوان غير صالح"); } const nonce = randomBytes(16).toString("hex"); addressMap.set(العنوان, nonce); إرجاع Response.json({ البيانات: nonce, }); }

signMessage

يتم عادةً تنفيذ signMessage بواسطة مكون إضافي للمحفظة، ونحن نستخدم طريقة التوقيع الخاصة بـ Wagmi.

تحقق من الرسالة

يحتاج الجزء الخلفي إلى التحقق من محتوى التوقيع وإجراء فحص الأمان:

جافا سكريبت استيراد { إنشاء عميل عام، http } من "viem"؛ استيراد { الشبكة الرئيسية } من "viem/chains"; استيراد jwt من "jsonwebtoken"; import { parseSiweMessage } من "viem / siwe" ؛ استيراد { addressMap } من "../cache";

const JWT_SECRET = "your-secret-key"; // يرجى استخدام مفتاح أكثر أمانًا، وإضافة التحقق من انتهاء الصلاحية وما إلى ذلك

const publicClient = createPublicClient({ سلسلة: الشبكة الرئيسية, النقل: http(), });

تصدير الدالة غير المتزامنة POST(request: Request) { const { signature, message } = await request.json();

const { nonce ، العنوان = "0x" } = parseSiweMessage(message) ؛

إذا (!nonce || nonce !== addressMap.get(address)) { رمي Error( جديد "غير صالح") ؛ }

const valid = await publicClient.verifySiweMessage({ رسالة، العنوان، التوقيع، });

إذا (!valid) { throw new Error("توقيع غير صالح"); }

رمز const = jwt.sign({ address }, JWT_SECRET, { expiresIn: "1h" }); إرجاع Response.json({ بيانات: توكن, }); }

SIWE دليل المستخدم: كيف تجعل Dapp الخاص بك أكثر قوة؟

اقتراحات التحسين

لزيادة سرعة التحقق، يُنصح باستخدام خدمة عقدة مخصصة. يمكن استخدام خدمة عقدة ZAN، والحصول على اتصال HTTPS RPC ثم استبدال RPC الافتراضي في الكود.

جافا سكريبت const publicClient = createPublicClient({ سلسلة: الشبكة الرئيسية, النقل: http('), //خدمة RPC لزرع ZAN });

سيؤدي ذلك إلى تقليل وقت التحقق بشكل كبير وزيادة سرعة الواجهة.

SIWE دليل الاستخدام: كيف تجعل تطبيقك أكثر قوة؟

ETH-2.72%
DAPP3.06%
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 5
  • مشاركة
تعليق
0/400
NoodlesOrTokensvip
· منذ 20 س
مربك نوعًا ما ما هو التحقق من الهوية في web3
شاهد النسخة الأصليةرد0
TrustlessMaximalistvip
· منذ 21 س
لم يتحدث عن النقطة الرئيسية على الإطلاق، سوي ستذهب إلى السماء.
شاهد النسخة الأصليةرد0
WalletAnxietyPatientvip
· منذ 21 س
مع واجهة تسجيل الدخول الجديدة أصبحت أسرع وأكثر أمانًا... يجب أن أجرب ذلك.
شاهد النسخة الأصليةرد0
SchrodingerWalletvip
· منذ 21 س
التحقق من هوية Dapp صعب حقًا ها
شاهد النسخة الأصليةرد0
MEVSandwichvip
· منذ 21 س
هذه فقط مسؤولة عن باب eth ، ولا تتعلق بالسلاسل الأخرى.
شاهد النسخة الأصليةرد0
  • تثبيت