SIWE (تسجيل الدخول باستخدام إيثيريوم) هي طريقة للتحقق من هوية المستخدمين على إيثيريوم، مشابهة لإجراء المعاملات، حيث تثبت السيطرة على المحفظة. في الوقت الحالي، تدعم معظم إضافات المحفظة هذه الطريقة البسيطة للتوقيع.
تتناول هذه المقالة مشهد التوقيع على الإيثيريوم ، ولا تتعلق بسلاسل الكتل العامة الأخرى.
هل يحتاج مشروعك إلى SIWE؟
إذا كان لدى تطبيقك اللامركزي المتطلبات التالية، يمكنك التفكير في استخدام SIWE:
امتلاك نظام مستخدم خاص به
يحتاج إلى استعلام عن المعلومات المتعلقة بخصوصية المستخدم
بالنسبة لتطبيقات Dapp( التي تقدم وظيفة الاستعلام الرئيسية مثل etherscan)، يمكن عدم استخدام SIWE.
على الرغم من أنه يمكن للواجهة الأمامية تأكيد التعريف بالهوية بعد توصيل المحفظة، إلا أن استدعاءات واجهة برمجة التطبيقات التي تتطلب دعمًا من الخلفية لا يمكن أن تثبت التعريف بالهوية فقط من خلال تمرير العنوان، لأن العنوان هو معلومات عامة.
مبدأ SIWE والعملية
تتضمن عملية SIWE ثلاث خطوات: ربط المحفظة، التوقيع، والحصول على التعريف بالهوية.
ربط المحفظة
هذا هو إجراء شائع في Web3، يتم الاتصال بـ Dapp من خلال مكون إضافي للمحفظة.
توقيع
خطوات توقيع SIWE تشمل:
الحصول على قيمة Nonce: استدعاء واجهة برمجة التطبيقات الخلفية للحصول على قيمة Nonce عشوائية مرتبطة بالعنوان.
بناء محتوى التوقيع: يشمل قيمة Nonce، اسم النطاق، معرف السلسلة وغيرها من المعلومات.
توقيع المحفظة: استخدم الطريقة التي توفرها المحفظة لتوقيع المحتوى.
إرسال التوقيع: إرسال التوقيع للتحقق من قبل الواجهة الخلفية.
الحصول على التعريف بالهوية
بعد التحقق من صحة توقيع الخلفية، يتم إرجاع معرف هوية المستخدم ( مثل JWT ). يمكن إثبات ملكية المحفظة عن طريق الطلبات اللاحقة التي تحمل العنوان ومعرف الهوية.
ممارسة SIWE
سنقوم بتطوير تطبيق كامل باستخدام Next.js يدعم SIWE.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 8
أعجبني
8
6
مشاركة
تعليق
0/400
BTCRetirementFund
· منذ 12 س
لا أفهم حقًا ما هو SIWE هذا.
شاهد النسخة الأصليةرد0
LightningLady
· منذ 12 س
هل لا تحتاج حتى إلى هذا الجزء الخلفي؟ ألا يبدو SIWE جذاباً؟
شاهد النسخة الأصليةرد0
SatoshiNotNakamoto
· منذ 12 س
أليس هذا هو تسجيل الدخول بالتوقيع؟ لماذا يبدو معقدًا جدًا؟
شاهد النسخة الأصليةرد0
MevShadowranger
· منذ 12 س
آه، أليس هذا هو نفس الفخ الذي كان في web2، لكن للبلوكتشين؟
شاهد النسخة الأصليةرد0
MEVSandwich
· منذ 12 س
嗯 يبدو أن التحقق من البنية التحتية لـ ETH في النظام البيئي لا يزال معقدًا بعض الشيء.
شاهد النسخة الأصليةرد0
AirdropLicker
· منذ 12 س
آه، يمكن أن تكون التوقيعات ممتعة. لقد تعلمت، لقد تعلمت.
SIWE: دليل الممارسة الشاملة لبناء تطبيقات لامركزية للتحقق من الهوية على إثيريوم
SIWE: أداة قوية للتحقق من الهوية لـ Dapp
SIWE (تسجيل الدخول باستخدام إيثيريوم) هي طريقة للتحقق من هوية المستخدمين على إيثيريوم، مشابهة لإجراء المعاملات، حيث تثبت السيطرة على المحفظة. في الوقت الحالي، تدعم معظم إضافات المحفظة هذه الطريقة البسيطة للتوقيع.
تتناول هذه المقالة مشهد التوقيع على الإيثيريوم ، ولا تتعلق بسلاسل الكتل العامة الأخرى.
هل يحتاج مشروعك إلى SIWE؟
إذا كان لدى تطبيقك اللامركزي المتطلبات التالية، يمكنك التفكير في استخدام SIWE:
بالنسبة لتطبيقات Dapp( التي تقدم وظيفة الاستعلام الرئيسية مثل etherscan)، يمكن عدم استخدام SIWE.
على الرغم من أنه يمكن للواجهة الأمامية تأكيد التعريف بالهوية بعد توصيل المحفظة، إلا أن استدعاءات واجهة برمجة التطبيقات التي تتطلب دعمًا من الخلفية لا يمكن أن تثبت التعريف بالهوية فقط من خلال تمرير العنوان، لأن العنوان هو معلومات عامة.
مبدأ SIWE والعملية
تتضمن عملية SIWE ثلاث خطوات: ربط المحفظة، التوقيع، والحصول على التعريف بالهوية.
ربط المحفظة
هذا هو إجراء شائع في Web3، يتم الاتصال بـ Dapp من خلال مكون إضافي للمحفظة.
توقيع
خطوات توقيع SIWE تشمل:
الحصول على قيمة Nonce: استدعاء واجهة برمجة التطبيقات الخلفية للحصول على قيمة Nonce عشوائية مرتبطة بالعنوان.
بناء محتوى التوقيع: يشمل قيمة Nonce، اسم النطاق، معرف السلسلة وغيرها من المعلومات.
توقيع المحفظة: استخدم الطريقة التي توفرها المحفظة لتوقيع المحتوى.
إرسال التوقيع: إرسال التوقيع للتحقق من قبل الواجهة الخلفية.
الحصول على التعريف بالهوية
بعد التحقق من صحة توقيع الخلفية، يتم إرجاع معرف هوية المستخدم ( مثل JWT ). يمكن إثبات ملكية المحفظة عن طريق الطلبات اللاحقة التي تحمل العنوان ومعرف الهوية.
ممارسة SIWE
سنقوم بتطوير تطبيق كامل باستخدام Next.js يدعم SIWE.
العمل التحضيري
npx create-next-app@14
npm تثبيت antd @ant-design/web3 @ant-design/web3-wagmi wagmi viem @tanstack/react-query --save
إدخال Wagmi
قدم WagmiProvider في layout.tsx:
جي إس إكس استيراد { WagmiWeb3ConfigProvider } من "@ant-design / web3-wagmi" ؛
const WagmiProvider = ({ children }) = > { ( الإرجاع <wagmiweb3configprovider config="{{" 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], وسائل النقل: { [Mainnet.id]: http()، }, المحافظ: [MetaMask() ، WalletConnect() ، TokenPocket() ، OkxWallet()] }} > {أطفال} ); };
إضافة زر الاتصال
إنشاء زر لربط المحفظة والتوقيع:
جي إس إكس تصدير الدالة الافتراضية App() { const jwt = React.useContext(JwtProvider);
( الإرجاع <connectbutton.connector> {({ الحساب، الاتصال }) => ( < زر onclick="{connect}"> {حساب ؟ متصل: ${account.address.slice(0,6)}...${account.address.slice(-4)} : "Connect Wallet"} )} </connectbutton.connector> ); }
تنفيذ واجهة برمجة التطبيقات الخلفية
واجهة Nonce
جافا سكريبت تصدير الدالة غير المتزامنة GET(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({ data: nonce }); }
واجهة توقيع التحقق
جافا سكريبت تصدير الدالة غير المتزامنة POST(request) { const { التوقيع, الرسالة } = 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({ data: token }); }
تحسين الأداء
لزيادة سرعة التحقق، يُوصى باستخدام خدمات العقد المتخصصة. يمكنك استخدام خدمة عقد ZAN، بدلاً من RPC الافتراضي:
جافا سكريبت const publicClient = createPublicClient({ السلسلة: الشبكة الرئيسية, النقل: http('), // خدمة ZAN عقد RPC });
سيؤدي ذلك إلى تحسين كبير في سرعة استجابة واجهة المستخدم.