مفتاح API سري في تطبيق Expo: ما الذي يجب حمايته؟
بقلم Mehdi Azizi
حُدّث في ، 7 د
مفتاح Supabase العام، سر الخادم، متغيرات Expo: اعرف ما يمكن تضمينه في تطبيق iPhone، واختبر الصلاحيات بحسابين.
متغير البيئة ليس بالضرورة سرًّا
في تطبيق Expo، المتغير الذي يبدأ بالبادئة EXPO_PUBLIC_ مخصص لكود التطبيق. لا يجوز أن يحتوي على سر من أسرار الخادم. توضح Expo أن هذه القيم تُدمج في JavaScript المُجمَّع ويمكن لمستخدمي التطبيق قراءتها. لذلك نقل المفتاح إلى ملف .env لا يكفي لحمايته. المصدر: متغيرات البيئة في Expo.
قبل أن تطلب من ذكاء اصطناعي «ربط الـ API»، صنّف ما تعطيه له: عنوان خدمة، أو مفتاح مصمم ليكون عامًّا، أو مفتاح يسمح بإجراءات ذات صلاحيات عالية. هذا التصنيف هو الذي يحدد أين يجب أن يُنفَّذ الكود.
الجدول التالي شبكة للتصميم، وليس تدقيقًا لتطبيقك.
| العنصر | أين تضعه | ما يجب التحقق منه |
|---|---|---|
| العنوان العام للـ backend | إعدادات التطبيق | يشير إلى البيئة الصحيحة. |
| مفتاح Supabase من نوع publishable، أو مفتاح anon القديم | التطبيق، إذا كانت الصلاحيات مضبوطة بشكل صحيح | قواعد البيانات تمنع فعلًا الوصول إلى حساب مستخدم آخر. |
| مفتاح Supabase من نوع secret أو service_role | الخادم فقط | لا يظهر في الـ bundle الخاص بالجوال ولا في السجلات التي يصل إليها العميل. |
| المفتاح السري لمزوّد ذكاء اصطناعي | الخادم فقط | التطبيق يستدعي خادمك، وخادمك يتحقق من المستخدم ومن الحدود قبل الاتصال بالمزوّد. |
تفرّق Supabase بين المفاتيح المخصصة للعملاء والمفاتيح السرية المخصصة للبيئات الموثوقة. المفتاح العام يعرّف المشروع، لكنه لا يحل محل الصلاحيات على البيانات. المصدر: مفاتيح API في Supabase.
مثال: تطبيق وهمي لدفتر القراءة
لنتخيل تطبيقًا تسجل فيه ليا وسامي كتبهما وملاحظاتهما الخاصة. هذا المثال يساعدك على تحضير الاختبارات، ولا يصف نتائج حصلنا عليها في تطبيق من تطبيقات Devoria.
المسار العادي يبدو سليمًا: ليا تسجّل الدخول وترى ملاحظاتها. لكن هذا لا يجيب بعد عن السؤال المهم: هل يرفض الخادم طلبًا من ليا يستهدف ملاحظة لسامي؟
الفلتر في الواجهة، مثل «عرض ملاحظات المستخدم المتصل»، يحسّن العرض فقط. يجب أن تُطبَّق الصلاحيات أيضًا على مستوى البيانات. في Supabase، تسمح قواعد Row Level Security بتقييد الصفوف المتاحة حسب الجلسة. توصي Supabase بتفعيلها للجداول المكشوفة عبر الـ API، وتشرح سياسات القراءة والكتابة. المصدر: Row Level Security.
في مشروعك التجريبي، اربط كل ملاحظة بمالكها، وحدّد بشكل منفصل من يستطيع قراءتها وإنشاءها وتعديلها وحذفها. تحقق من الملفات أيضًا: حماية صف في قاعدة البيانات لا تثبت أن الصورة خاصة.
خطة الاختبار التي تنفذها بحسابَي اختبار
جهّز حسابين تتحكم فيهما، مع كتاب مختلف في كل حساب وملاحظة صغيرة يسهل التعرف عليها. استخدم بيانات وهمية في بيئة اختبار مسموح بها.
- قراءة ملاحظتك. الحساب A يجد الملاحظة A.
- قراءة ملاحظة B من الحساب A. الطلب لا يكشف محتواها الخاص.
- تعديل ملاحظة B من الحساب A. الخادم يرفض، والملاحظة B تبقى كما هي.
- الإنشاء باسم B من الحساب A. الخادم يرفض هذه النسبة.
- القراءة بدون جلسة. لا يُعاد أي محتوى خاص.
- فتح ملف B الخاص من الحساب A. الملف غير متاح.
سجّل النتيجة الفعلية، والإصدار الذي اختبرته، والخطأ إن وُجد. عبارة «القواعد مفعّلة» ليست نتيجة اختبار. يمكنك استخدام شبكة الاختبار المتوفرة في الموارد كأساس لحفظ هذه الأدلة.
مرّر الاستدعاء المدفوع عبر خادمك
لميزة تلخّص كتابًا باستخدام API ذكاء اصطناعي، يمكن أن يكون المسار: التطبيق ← خادمك ← المزوّد ← خادمك ← التطبيق. المفتاح السري يبقى على الخادم. لكن هذه البنية وحدها لا تكفي: يجب أيضًا التحكم في الوصول إلى الخادم.
في المثال الوهمي، يجب على الخادم خصوصًا أن يتحقق من الجلسة، وأن يتأكد أن الكتاب يخص الشخص نفسه، وأن يحدّ من الطلبات المتكررة، وأن يعيد خطأً مفهومًا إذا لم يستجب المزوّد. العميل لا يقرر بنفسه أن المستخدم يملك وصولًا مدفوعًا.
جهّز أربع تجارب: مستخدم غير متصل، كتاب من حساب آخر، بلوغ الحد، ومزوّد غير متاح. التجربة الأخيرة تتيح لك التحقق من أن التطبيق يخرج من حالة التحميل دون أن يضيع ما كتبه المستخدم.
ما يمكنك أن تطلبه من مساعد البرمجة
إليك تعليمات مراجعة تكيّفها مع مستودعك، دون أن تلصق فيها قيمك السرية:
اجرد المتغيرات التي يستخدمها كود الجوال والخادم، واعرض أسماءها فقط. حدّد الاستدعاءات ذات الصلاحيات العالية الموجودة في جهة العميل. بالنسبة للبيانات الخاصة، صِف ضوابط القراءة والكتابة، ثم اقترح خطة اختبار بحسابَي اختبار. لا تنفّذ أي تدوير للمفاتيح أو تعديل على الإنتاج دون موافقة.
اقرأ الرد مع الكود المقابل له. قد يكتشف المساعد تناقضًا، لكن رده لا يغني عن تنفيذ الاختبارات. يشرح دليل إنشاء تطبيق باستخدام Claude Code كيف تقسّم هذا العمل.
قبل أن تكمل تطبيقك
يجب أن تستطيع شرح ثلاثة أمور ببساطة: ما القيم العامة، وما العمليات التي تمر عبر الخادم، وما الاختبارات التي تثبت أن حسابًا لا يرى بيانات حساب آخر. إذا بقيت إحدى هذه النقاط غامضة، فوضّحها قبل إضافة ميزات جديدة.
صفحة إنشاء تطبيق iPhone تضع هذه الخطوة في سياق المشروع الكامل. لتتقدم بالترتيب، يقدم iOS Kit مسارًا من أربع خطوات وكودًا أوليًا يتضمن الحسابات والذكاء الاصطناعي مسبقًا. وإذا لم تعد تعرف من أي خطوة تستأنف، فإن التشخيص المجاني يعيد ترتيب مشروعك ويرسل لك قائمتي للتحقق ضد رفض Apple.
الأسئلة الشائعة
أين أضع مفتاح API السري في تطبيق Expo؟
على خادمك، وليس في التطبيق أبدًا. مفتاح Supabase من نوع secret أو service_role، مثل المفتاح السري لمزوّد ذكاء اصطناعي، يجب أن يبقى على الخادم فقط. التطبيق يستدعي خادمك، وخادمك يتحقق من المستخدم ومن الحدود قبل استدعاء المزوّد. تأكد أن أيًّا من هذه المفاتيح لا يظهر في الـ bundle الخاص بالجوال ولا في السجلات التي يصل إليها العميل.
هل يحمي ملف .env مفتاح API في Expo؟
ليس وحده. المتغير الذي يبدأ بالبادئة EXPO_PUBLIC_ مخصص لكود التطبيق ولا يجوز أن يحتوي على سر من أسرار الخادم. توضح Expo أن هذه القيم تُدمج في JavaScript المُجمَّع ويمكن لمستخدمي التطبيق قراءتها. لذلك نقل المفتاح إلى ملف .env لا يكفي لحمايته.
ما الفرق بين مفتاح API العام والمفتاح السري؟
المفتاح العام مصمم ليُضمَّن في التطبيق: يعرّف المشروع، لكنه لا يحل محل الصلاحيات على البيانات. المفتاح السري يسمح بإجراءات ذات صلاحيات عالية ويبقى محصورًا في البيئات الموثوقة. في Supabase، يمكن أن يبقى مفتاح publishable، أو مفتاح anon القديم، في التطبيق إذا كانت الصلاحيات مضبوطة بشكل صحيح. أما مفاتيح secret وservice_role فتبقى على الخادم.
كيف أستدعي API ذكاء اصطناعي من تطبيق Expo دون كشف المفتاح؟
مرّر الاستدعاء عبر خادمك: التطبيق يستدعي الخادم، والخادم يستدعي المزوّد ثم يعيد الرد إلى التطبيق. المفتاح السري يبقى على الخادم. ويجب على الخادم أيضًا أن يتحقق من الجلسة، وأن يحدّ من الطلبات المتكررة، وأن يعيد خطأً مفهومًا إذا لم يستجب المزوّد. العميل لا يقرر بنفسه أن المستخدم يملك وصولًا مدفوعًا.
كيف أتحقق من أن كل مستخدم لا يرى إلا بياناته؟
جهّز حسابَي اختبار تتحكم فيهما، مع ملاحظة يسهل التعرف عليها في كل منهما. من الحساب A، حاول القراءة والتعديل والإنشاء باسم الحساب B، ثم حاول فتح ملف B الخاص. نفّذ التجارب أيضًا بدون جلسة: يجب أن يُرفض كل طلب أو ألا يكشف شيئًا. سجّل النتيجة الفعلية، لأن عبارة «القواعد مفعّلة» ليست نتيجة اختبار.
كيف أطلب من ذكاء اصطناعي فحص مفاتيح تطبيقي؟
اطلب منه جرد متغيرات كود الجوال والخادم، مع عرض أسمائها فقط، ودون أن تلصق قيمك السرية. اطلب منه أيضًا تحديد الاستدعاءات ذات الصلاحيات العالية الموجودة في جهة العميل، واقتراح خطة اختبار بحسابَي اختبار. امنع أي تدوير للمفاتيح أو تعديل على الإنتاج دون موافقة. رده لا يغني عن تنفيذ الاختبارات.