المصادقة على إيثيريوم
إذا كنت قادمًا من تطوير الويب التقليدي، فأنت معتاد على تسجيل الدخول باستخدام اسم المستخدم/كلمة المرور، وتدفقات OAuth، وملفات تعريف ارتباط الجلسة. تعمل المصادقة على إيثيريوم بشكل مختلف — وبطرق عديدة، بشكل أبسط.
على إيثيريوم، يثبت المستخدم هويته من خلال توقيع رسالة باستخدام محفظته. لا توجد كلمة مرور لتخزينها. لا توجد قاعدة بيانات لبيانات الاعتماد يمكن تسريبها. فقط علم التشفير.
كيف تختلف عن ويب 2؟
| ويب 2 | إيثيريوم |
|---|---|
| اسم المستخدم + كلمة المرور | عنوان المحفظة + توقيع |
| الخادم يخزن بيانات الاعتماد | المستخدم يحتفظ بمفتاح خاص |
| تدار الجلسات بواسطة ملفات تعريف الارتباط / JWT | تبدأ الجلسات بتوقيع محفظة خارج السلسلة |
| "تسجيل الدخول باستخدام Google" | "تسجيل الدخول باستخدام إيثيريوم" |
| تدفقات إعادة تعيين كلمة المرور | استعادة عبارة الاسترداد |
التحول الأساسي: في ويب 2، يقوم خادم مركزي بمصادقتك. على إيثيريوم، أنت تصادق نفسك من خلال إثبات أنك تتحكم في عنوان معين — ويمكن لأي شخص التحقق من ذلك بشكل مستقل.
المتطلبات الأساسية
تأكد من فهمك لما يلي:
كيف تعمل المصادقة القائمة على المحفظة
التدفق الأساسي بسيط:
- يطلب تطبيقك اللامركزي (dapp) من المستخدم توصيل محفظته (عبر ميتاماسك، Rainbow، WalletConnect، إلخ.)
- تشارك المحفظة عنوان إيثيريوم الخاص بالمستخدم - هذا هو معرفهم العام
- ينشئ تطبيقك اللامركزي رسالة فريدة (رقم فريد أو تحدي)
- يوقع المستخدم الرسالة باستخدام مفتاحه الخاص (يحدث داخل المحفظة)
- تتحقق الواجهة الخلفية الخاصة بك من التوقيع مقابل العنوان المطالب به
- إذا كان صالحًا، تتم مصادقة المستخدم
لم يتم كتابة أو تخزين أو نقل أي كلمة مرور على الإطلاق.
تسجيل الدخول باستخدام إيثيريوم (EIP-4361)
يحدد EIP-4361 (يفتح في علامة تبويب جديدة) تنسيق رسالة قياسي لتسجيل الدخول إلى إيثيريوم، والذي يُطلق عليه عادةً SIWE (تسجيل الدخول باستخدام إيثيريوم). إنه يستبدل توقيع الرسائل المخصص بمعيار منظم وآمن.
تبدو رسالة SIWE هكذا:
example.com wants you to sign in with your Ethereum account:
0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B
I accept the Terms of Service: https://example.com/tos
URI: https://example.com/login
Version: 1
Chain ID: 1
Nonce: 32891757
Issued At: 2024-06-12T14:30:00Z
الميزات الرئيسية لـ SIWE:
- ربط النطاق - تتضمن الرسالة النطاق، مما يمنع التصيد الاحتيالي
- معرف السلسلة - يحدد الشبكة التي يكون التوقيع صالحًا لها
- رقم فريد - يمنع هجمات إعادة التشغيل
- انتهاء الصلاحية - طابع زمني اختياري يحد من نافذة الصلاحية
- الموارد - معرفات موارد موحدة (URIs) اختيارية للوصول المحدد النطاق
مكتبات SIWE
- siwe (يفتح في علامة تبويب جديدة) - تطبيق TypeScript الرسمي بواسطة Spruce
- siwe-rs (يفتح في علامة تبويب جديدة) - تطبيق Rust
- siwe-go (يفتح في علامة تبويب جديدة) - تطبيق Go
مثال: تسجيل الدخول من جانب العميل باستخدام siwe
import { SiweMessage } from 'siwe'
import { BrowserProvider } from 'ethers'
async function signIn() {
const provider = new BrowserProvider(window.ethereum)
const signer = await provider.getSigner()
const address = await signer.getAddress()
// 1. احصل على رقم فريد من الواجهة الخلفية
const { nonce } = await fetch('/api/auth/nonce').then(r => r.json())
// 2. أنشئ ووقّع رسالة SIWE
const message = new SiweMessage({
domain: window.location.host,
address,
statement: 'Sign in to My Dapp',
uri: window.location.origin,
version: '1',
chainId: 1,
nonce,
})
const signature = await signer.signMessage(message.prepareMessage())
// 3. أرسل إلى الواجهة الخلفية للتحقق
await fetch('/api/auth/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message, signature }),
})
}
مثال: التحقق من جانب الخادم (Node.js)
import { SiweMessage, generateNonce } from 'siwe'
// أصدر رقمًا فريدًا وخزنه في الجلسة حتى يتمكن /verify من التحقق منه لاحقًا
app.get('/api/auth/nonce', (req, res) => {
req.session.nonce = generateNonce()
res.json({ nonce: req.session.nonce })
})
app.post('/api/auth/verify', async (req, res) => {
try {
const { message, signature } = req.body
const siweMessage = new SiweMessage(message)
const { success, data } = await siweMessage.verify({
signature,
nonce: req.session.nonce,
})
if (success) {
// data.address هو عنوان إيثيريوم الذي تم التحقق منه
// أنشئ جلسة أو JWT للمستخدم
req.session.address = data.address
res.json({ ok: true, address: data.address })
}
} catch {
res.status(401).json({ error: 'Invalid signature' })
}
})
مكتبات توصيل المحفظة
قبل المصادقة، تحتاج إلى أن يقوم المستخدم بتوصيل محفظته. هذه المكتبات تجعل الأمر سهلاً:
- RainbowKit (يفتح في علامة تبويب جديدة) - مكون React جاهز للاستخدام مع واجهة مستخدم جميلة
- ConnectKit (يفتح في علامة تبويب جديدة) - نافذة منبثقة جاهزة لتوصيل المحفظة
- AppKit (WalletConnect) (يفتح في علامة تبويب جديدة) - توصيل محفظة متعددة السلاسل مع SIWE مدمج
- Wagmi (يفتح في علامة تبويب جديدة) - مكتبة React Hooks مع
useAccount،useConnect
التحقق من التوقيعات يدويًا
إذا كنت تفضل عدم استخدام SIWE، يمكنك التحقق من التوقيعات مباشرة:
import { verifyMessage } from 'ethers'
// الرسالة التي وقّعها المستخدم
const message = `Sign in to My Dapp. Nonce: ${storedNonce}`
// استرد عنوان الموقّع من التوقيع
const recoveredAddress = verifyMessage(message, signature)
// قارن مع العنوان المُدّعى
if (recoveredAddress.toLowerCase() === claimedAddress.toLowerCase()) {
// نجحت المصادقة
}
ملاحظات أمنية هامة
- استخدم دائمًا رقم فريد - يمنع هجمات إعادة التشغيل حيث يتم إعادة استخدام توقيع قديم
- قم بتضمين النطاق - يمنع التوقيعات من أن تكون صالحة عبر مواقع مختلفة
- تحقق من انتهاء الصلاحية - يجب أن يكون للتوقيعات نافذة صلاحية محدودة
- استخدم SIWE (EIP-4361) كلما أمكن ذلك - فهو يتعامل مع كل ما سبق نيابة عنك
- لا تكشف أبدًا عن المفاتيح الخاصة - يحدث التوقيع داخل المحفظة؛ تطبيقك يرى النتيجة فقط
إدارة الجلسات
بمجرد المصادقة، لا تزال بحاجة إلى جلسات — تمامًا مثل ويب 2. الأنماط الشائعة:
- رموز JWT - إصدار JWT بعد التحقق من التوقيع، واستخدامه لطلبات API
- جلسات من جانب الخادم - تخزين العنوان الذي تم التحقق منه في ملف تعريف ارتباط الجلسة
- SIWE مع الموارد - تحديد رموز وصول محددة النطاق مرتبطة بمعرفات موارد موحدة (URIs) محددة
الاختلاف الرئيسي عن ويب 2: عنوان إيثيريوم الخاص بالمستخدم هو هويته الدائمة. يمكنهم استخدامه عبر أي تطبيق لامركزي (dapp) دون إنشاء حساب جديد.
هوية لامركزية
تعد مصادقة إيثيريوم جزءًا من حركة أوسع نحو الهوية السيادية الذاتية. تشمل المعايير والمشاريع في هذا المجال:
- خدمة أسماء إيثيريوم (ENS) (يفتح في علامة تبويب جديدة) - أسماء قابلة للقراءة بواسطة الإنسان (مثل،
vitalik.eth) والتي تُترجم إلى عناوين - خدمة تصديق إيثيريوم (EAS) (يفتح في علامة تبويب جديدة) - تصديقات على السلسلة حول الهوية وبيانات الاعتماد
- معرفات لامركزية من W3C (DIDs) (يفتح في علامة تبويب جديدة) - معيار عالمي لهوية لامركزية قابلة للتحقق
- شبكة Ceramic (يفتح في علامة تبويب جديدة) - تدفقات بيانات لامركزية مرتبطة بهوية لامركزية (DID)
قراءة إضافية
- EIP-4361: تسجيل الدخول باستخدام إيثيريوم (يفتح في علامة تبويب جديدة)
- وثائق SIWE (يفتح في علامة تبويب جديدة)
- تسجيل الدخول باستخدام إيثيريوم على Auth0 (يفتح في علامة تبويب جديدة)
- وثائق مصادقة Reown AppKit (يفتح في علامة تبويب جديدة)
- وثائق ENS (يفتح في علامة تبويب جديدة)