1. قبل البدء
لضمان شرعية المستخدمين الذين يتفاعلون مع تطبيق الويب، عليك تنفيذ Firebase App Check والاستفادة من الرموز المميّزة JWT لـ reCAPTCHA للتحقّق من جلسات المستخدمين. سيتيح لك هذا الإعداد معالجة الطلبات من تطبيق العميل إلى Places API (الإصدار الجديد) بأمان.
المحتوى الذي ستنشئه:
لتوضيح ذلك، ستنشئ تطبيق ويب يعرض خريطة عند التحميل. وسينشئ أيضًا رمزًا مميّزًا لـ reCAPTCHA بشكل غير محسوس باستخدام حزمة تطوير البرامج (SDK) لمنصّة Firebase. بعد ذلك، يتم إرسال هذا الرمز المميّز إلى خادم Node.js، حيث تتحقّق Firebase من صحته قبل تنفيذ أي طلبات إلى Places API.
إذا كان الرمز المميّز صالحًا، سيخزّنه Firebase App Check إلى أن تنتهي صلاحيته، ما يغني عن إنشاء رمز مميّز جديد لكل طلب من طلبات العميل. إذا كان الرمز المميّز غير صالح، سيُطلب من المستخدم إكمال اختبار التحقّق من reCAPTCHA مرة أخرى للحصول على رمز مميّز جديد.
2. المتطلبات الأساسية
عليك الاطّلاع على العناصر أدناه لإكمال هذا الدليل التعليمي حول رموز برمجية.
منتجات Google Cloud المطلوبة
- Google Cloud Firebase App Check: قاعدة بيانات لإدارة الرموز المميّزة
- Google reCAPTCHA: إنشاء الرمز المميّز وإثبات ملكيته وهي أداة تُستخدَم للتمييز بين المستخدمين وبرامج التتبُّع على المواقع الإلكترونية. وتعمل هذه الميزة من خلال تحليل سلوك المستخدم وسمات المتصفّح ومعلومات الشبكة لإنشاء نتيجة تشير إلى احتمال أن يكون المستخدم بوتًا. إذا كانت النتيجة عالية بما يكفي، يُعتبر المستخدم إنسانًا، ولا يلزم اتّخاذ أي إجراء آخر. إذا كانت النتيجة منخفضة، قد يتم عرض أحجية CAPTCHA لتأكيد هوية المستخدم. وهذا الأسلوب أقل تدخلاً من طرق CAPTCHA التقليدية، ما يجعل تجربة المستخدم أكثر سلاسة.
- (اختياري) Google Cloud App Engine: بيئة النشر
منتجات "منصة خرائط Google" المطلوبة
في هذا الدليل التعليمي حول رموز البرامج، ستستخدم منتجات "منصّة خرائط Google" التالية:
- تم تحميل واجهة برمجة تطبيقات JavaScript لخرائط Google وعرضها في تطبيق الويب
- طلب Places API (الإصدار الجديد) الذي أصدره خادم الخلفية
متطلبات أخرى لهذا الدرس التطبيقي حول الترميز
لإكمال هذا الدليل التعليمي حول رموز البرامج، ستحتاج إلى الحسابات والخدمات والأدوات التالية:
- حساب على Google Cloud Platform تم تفعيل الفوترة فيه
- مفتاح واجهة برمجة تطبيقات "منصة خرائط Google" مع تفعيل واجهة برمجة التطبيقات JavaScript لخرائط Google وPlaces
- معرفة أساسية بلغات JavaScript وHTML وCSS
- معرفة أساسية بـ Node.js
- محرِّر نصوص أو حزمة تطوير برامج موحّدة من اختيارك
3- الاستعداد
إعداد "منصة خرائط Google"
إذا لم يكن لديك حساب على Google Cloud Platform ومشروع تم تفعيل ميزة الفوترة فيه، يُرجى الاطّلاع على دليل البدء في استخدام Google Maps Platform لإنشاء حساب فوترة ومشروع.
- في Cloud Console، انقر على القائمة المنسدلة للمشروع واختَر المشروع الذي تريد استخدامه في هذا الدليل التعليمي.
- فعِّل واجهات برمجة تطبيقات Google Maps Platform وحِزم SDK المطلوبة لهذا الدليل التعليمي في Google Cloud Marketplace. لإجراء ذلك، اتّبِع الخطوات الواردة في هذا الفيديو أو هذه المستندات.
- أنشئ مفتاح واجهة برمجة التطبيقات في صفحة بيانات الاعتماد في Cloud Console. يمكنك اتّباع الخطوات الواردة في هذا الفيديو أو هذه المستندات. تتطلّب جميع الطلبات المرسَلة إلى "منصّة خرائط Google" مفتاح واجهة برمجة التطبيقات.
بيانات الاعتماد التلقائية للتطبيق
ستستخدم حزمة Firebase Admin SDK للتفاعل مع مشروعك على Firebase بالإضافة إلى إرسال طلبات إلى Places API، وستحتاج إلى تقديم بيانات اعتماد صالحة لكي تعمل هذه الحزمة.
سنستخدم مصادقة ADC (Automatic Default Credentials) لمصادقة خادمك لتقديم الطلبات. بدلاً من ذلك (لا يُنصح بذلك)، يمكنك إنشاء حساب خدمة وتخزين بيانات الاعتماد في الرمز البرمجي.
التعريف: بيانات الاعتماد التلقائية للتطبيق (ADC) هي آلية تقدّمها Google Cloud لمصادقة تطبيقاتك تلقائيًا بدون إدارة بيانات الاعتماد بشكل صريح. ويبحث عن بيانات الاعتماد في مواقع مختلفة (مثل متغيّرات البيئة أو ملفات حسابات الخدمة أو خادم البيانات الوصفية في Google Cloud) ويستخدم أول بيانات اعتماد يعثر عليها.
- في Terminal، استخدِم الأمر أدناه الذي يسمح لتطبيقاتك بالوصول بأمان إلى موارد Google Cloud بالنيابة عن المستخدم الذي سجّل الدخول حاليًا:
gcloud auth application-default login
- عليك إنشاء ملف .env في الدليل الجذر يحدّد متغيّرًا لمشروع Google Cloud:
GOOGLE_CLOUD_PROJECT="your-project-id"
بيانات الاعتماد البديلة (لا يُنصح بها)
إنشاء حساب خدمة
- علامة التبويب Google Maps Platform > "+إنشاء بيانات اعتماد" > حساب الخدمة
- أضِف دور "مدير Firebase AppCheck"، ثم أدخِل اسم حساب الخدمة الذي كتبته للتو، أي: firebase-appcheck-codelab@yourproject.iam.gserviceaccount.com
بيانات الاعتماد
- انقر على حساب الخدمة الذي تم إنشاؤه.
- انتقِل إلى علامة التبويب "المفاتيح" لإنشاء مفتاح > JSON > حفظ بيانات اعتماد json التي تم تنزيلها. نقل ملف xxx.json الذي تم تنزيله تلقائيًا إلى المجلد الجذر
- (الفصل التالي) يجب تسمية الملف بشكل صحيح في ملف nodejs server.js (firebase-credentials.json).
4. دمج فحص التطبيقات من Firebase
ستحصل على تفاصيل إعدادات Firebase ومفاتيح reCAPTCHA السرية.
عليك لصقها في التطبيق التجريبي وبدء تشغيل الخادم.
إنشاء تطبيق في Firebase
- انتقِل إلى صفحة "مشرف المشروع" https://console.firebase.google.com (ابحث عن الروابط):
اختَر مشروع Google Cloud الذي سبق إنشاؤه (قد تحتاج إلى تحديد: "اختيار المورد الرئيسي").
- إضافة تطبيق من القائمة (رمز الترس) في أعلى يمين الصفحة
رمز إعداد Firebase
- احفظ رمز إعداد Firebase للصقّه في script.js (الفصل التالي) من جهة العميل.
- تسجيل تطبيقك للسماح لخدمة Firebase باستخدام الرموز المميّزة للإصدار 3 من reCAPTCHA
https://console.firebase.google.com/u/0/project/YOUR_PROJECT/appcheck/apps
- اختَر reCAPTCHA → أنشئ مفتاحًا في موقع reCAPTCHA الإلكتروني (مع ضبط النطاقات الصحيحة: localhost لتطوير التطبيقات)
- لصق مفتاح reCAPTCHA السري في Firebase AppCheck
- من المفترض أن يتحول لون حالة التطبيق إلى الأخضر.
5- التطبيق التجريبي
- تطبيق الويب للعملاء: ملفات HTML وJavaScript وCSS
- الخادم: ملف Node.js
- البيئة (.env): مفاتيح واجهة برمجة التطبيقات
- الإعدادات (app.yaml): إعدادات نشر Google App Engine
إعداد Node.js:
- التنقّل: افتح وحدة التحكّم الطرفية وانتقِل إلى الدليل الجذر لمشروعك المُنشئ من النسخة.
- تثبيت Node.js (إذا لزم الأمر): الإصدار 18 أو إصدار أحدث
node -v # Check installed version
- بدء المشروع: شغِّل الأمر التالي لبدء مشروع Node.js جديد، مع ترك جميع الإعدادات على الإعدادات التلقائية:
npm init
- تثبيت المكوّنات الإضافية: استخدِم الأمر التالي لتثبيت المكوّنات الإضافية المطلوبة للمشروع:
npm install @googlemaps/places firebase-admin express axios dotenv
الإعداد: متغيّرات البيئة لمشروع Google Cloud
- إنشاء ملف البيئة: في الدليل الجذر لمشروعك، أنشئ ملفًا باسم
.env
. سيخزِّن هذا الملف بيانات الإعدادات الحسّاسة، ويجب عدم إرسالها إلى نظام التحكّم في الإصدارات. - ملء متغيّرات البيئة: افتح ملف
.env
وأضِف المتغيّرات التالية، مع استبدال العناصر النائبة بالقيم الفعلية من مشروعك على Google Cloud:
# Google Cloud Project ID
GOOGLE_CLOUD_PROJECT="your-cloud-project-id"
# reCAPTCHA Keys (obtained in previous steps)
RECAPTCHA_SITE_KEY="your-recaptcha-site-key"
RECAPTCHA_SECRET_KEY="your-recaptcha-secret-key"
# Maps Platform API Keys (obtained in previous steps)
PLACES_API_KEY="your-places-api-key"
MAPS_API_KEY="your-maps-api-key"
6- نظرة عامة على الرمز
index.html
- تحميل مكتبات Firebase لإنشاء الرمز المميّز في التطبيق
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Places API with AppCheck</title>
<style></style> </head>
<body>
<div id="map"></div>
<!-- Firebase services -->
<script src="https://www.gstatic.com/firebasejs/9.15.0/firebase-app-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.15.0/firebase-app-check-compat.js"></script>
<script type="module" src="./script.js"></script>
<link rel="stylesheet" href="./style.css">
</body>
</html>
script.js
- جلب مفاتيح واجهة برمجة التطبيقات: تُسترجع مفاتيح واجهة برمجة التطبيقات لخرائط Google و"فحص التطبيقات من Firebase" من خادم خلفي.
- إعداد Firebase: لإعداد Firebase للمصادقة والأمان (استبدال الإعدادات → راجِع الفصل 4).
يتم ضبط مدة صلاحية رمز مفتاح أمان ميزة "فحص التطبيقات من Firebase"، والتي تتراوح بين 30 دقيقة و7 أيام، في وحدة تحكّم Firebase ولا يمكن تغييرها من خلال محاولة فرض إعادة تحميل رمز المفتاح.
- تفعيل ميزة "فحص التطبيقات": تتيح ميزة "فحص التطبيقات من Firebase" التحقّق من صحة الطلبات الواردة.
- تحميل Google Maps API: يتم تحميل مكتبة JavaScript لخرائط Google ديناميكيًا لعرض الخريطة.
- تهيئة الخريطة: لإنشاء خريطة Google تركّز على موقع جغرافي تلقائي
- معالجة النقرات على الخريطة: تتيح هذه الميزة رصد النقرات على الخريطة وتعديل نقطة المركز وفقًا لذلك.
- طلبات البحث في Places API: تُرسِل طلبات إلى واجهة برمجة تطبيقات الخلفية (
/api/data
) لاسترداد معلومات عن الأماكن (المطاعم والمتنزهات والحانات) بالقرب من الموقع الذي تم النقر عليه، وذلك باستخدام Firebase App Check للحصول على الإذن. - عرض العلامات: لعرض البيانات التي تم جلبها على الخريطة كعلامات مع عرض أسمائها ورموزها.
let mapsApiKey, recaptchaKey; // API keys
let currentAppCheckToken = null; // AppCheck token
async function init() {
try {
await fetchConfig(); // Load API keys from .env variable
/////////// REPLACE with your Firebase configuration details
const firebaseConfig = {
apiKey: "AIza.......",
authDomain: "places.......",
projectId: "places.......",
storageBucket: "places.......",
messagingSenderId: "17.......",
appId: "1:175.......",
measurementId: "G-CPQ.......",
};
/////////// REPLACE
// Initialize Firebase and App Check
await firebase.initializeApp(firebaseConfig);
await firebase.appCheck().activate(recaptchaKey);
// Get the initial App Check token
currentAppCheckToken = await firebase.appCheck().getToken();
// Load the Maps JavaScript API dynamically
const scriptMaps = document.createElement("script");
scriptMaps.src = `https://maps.googleapis.com/maps/api/js?key=${mapsApiKey}&libraries=marker,places&v=beta`;
scriptMaps.async = true;
scriptMaps.defer = true;
scriptMaps.onload = initMap; // Create the map after the script loads
document.head.appendChild(scriptMaps);
} catch (error) {
console.error("Firebase initialization error:", error);
// Handle the error appropriately (e.g., display an error message)
}
}
window.onload = init()
// Fetch configuration data from the backend API
async function fetchConfig() {
const url = "/api/config";
try {
const response = await fetch(url);
const config = await response.json();
mapsApiKey = config.mapsApiKey;
recaptchaKey = config.recaptchaKey;
} catch (error) {
console.error("Error fetching configuration:", error);
// Handle the error (e.g., show a user-friendly message)
}
}
// Initialize the map when the Maps API script loads
let map; // Dynamic Map
let center = { lat: 48.85557501, lng: 2.34565006 };
function initMap() {
map = new google.maps.Map(document.getElementById("map"), {
center: center,
zoom: 13,
mapId: "b93f5cef6674c1ff",
zoomControlOptions: {
position: google.maps.ControlPosition.RIGHT_TOP,
},
streetViewControl: false,
mapTypeControl: false,
clickableIcons: false,
fullscreenControlOptions: {
position: google.maps.ControlPosition.LEFT_TOP,
},
});
// Initialize the info window for markers
infoWindow = new google.maps.InfoWindow({});
// Add a click listener to the map
map.addListener("click", async (event) => {
try {
// Get a fresh App Check token on each click
const appCheckToken = await firebase.appCheck().getToken();
currentAppCheckToken = appCheckToken;
// Update the center for the Places API query
center.lat = event.latLng.lat();
center.lng = event.latLng.lng();
// Query for places with the new token and center
queryPlaces();
} catch (error) {
console.error("Error getting App Check token:", error);
}
});
}
function queryPlaces() {
const url = '/api/data'; // "http://localhost:3000/api/data"
const body = {
request: {
includedTypes: ['restaurant', 'park', 'bar'],
excludedTypes: [],
maxResultCount: 20,
locationRestriction: {
circle: {
center: {
latitude: center.lat,
longitude: center.lng,
},
radius: 4000,
},
},
},
};
// Provides token to the backend using header: X-Firebase-AppCheck
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Firebase-AppCheck': currentAppCheckToken.token,
},
body: JSON.stringify(body),
})
.then((response) => response.json())
.then((data) => {
// display if response successful
displayMarkers(data.places);
})
.catch((error) => {
alert('No places');
// eslint-disable-next-line no-console
console.error('Error:', error);
});
}
//// display places markers on map
...
server.js
- تحمِّل متغيّرات البيئة (مفاتيح واجهة برمجة التطبيقات، ورقم تعريف مشروع Google) من ملف
.env
. - بدء الخادم، والاستماع إلى الطلبات على
http://localhost:3000
- تهيئة حزمة تطوير البرامج (SDK) للمشرف في Firebase باستخدام بيانات الاعتماد التلقائية للتطبيق (ADC)
- تلقّي رمز مميّز لاختبار reCAPTCHA من
script.js
- للتحقّق من صلاحية الرمز المميّز الذي تم تلقّيه
- إذا كان الرمز المميّز صالحًا، يُرسِل طلب POST إلى Google Places API مع تضمين مَعلمات البحث.
- تعالج هذه الطريقة الاستجابة وتُعيدها من Places API إلى العميل.
const express = require('express');
const axios = require('axios');
const admin = require('firebase-admin');
// .env variables
require('dotenv').config();
// Store sensitive API keys in environment variables
const recaptchaSite = process.env.RECAPTCHA_SITE_KEY;
const recaptchaSecret = process.env.RECAPTCHA_SECRET_KEY;
const placesApiKey = process.env.PLACES_API_KEY;
const mapsApiKey = process.env.MAPS_API_KEY;
// Verify environment variables loaded (only during development)
console.log('recaptchaSite:', recaptchaSite, '\n');
console.log('recaptchaSecret:', recaptchaSecret, '\n');
const app = express();
app.use(express.json());
// Firebase Admin SDK setup with Application Default Credentials (ADC)
const { GoogleAuth } = require('google-auth-library');
admin.initializeApp({
// credential: admin.credential.applicationDefault(), // optional: explicit ADC
});
// Main API Endpoint
app.post('/api/data', async (req, res) => {
const appCheckToken = req.headers['x-firebase-appcheck'];
console.log("\n", "Token", "\n", "\n", appCheckToken, "\n")
try {
// Verify Firebase App Check token for security
const appCheckResult = await admin.appCheck().verifyToken(appCheckToken);
if (appCheckResult.appId) {
console.log('App Check verification successful!');
placesQuery(req, res);
} else {
console.error('App Check verification failed.');
res.status(403).json({ error: 'App Check verification failed.' });
}
} catch (error) {
console.error('Error verifying App Check token:', error);
res.status(500).json({ error: 'Error verifying App Check token.' });
}
});
// Function to query Google Places API
async function placesQuery(req, res) {
console.log('#################################');
console.log('\n', 'placesApiKey:', placesApiKey, '\n');
const queryObject = req.body.request;
console.log('\n','Request','\n','\n', queryObject, '\n')
const headers = {
'Content-Type': 'application/json',
'X-Goog-FieldMask': '*',
'X-Goog-Api-Key': placesApiKey,
'Referer': 'http://localhost:3000', // Update for production(ie.: req.hostname)
};
const myUrl = 'https://places.googleapis.com/v1/places:searchNearby';
try {
// Authenticate with ADC
const auth = new GoogleAuth();
const { credential } = await auth.getApplicationDefault();
const response = await axios.post(myUrl, queryObject, { headers, auth: credential });
console.log('############### SUCCESS','\n','\n','Response','\n','\n', );
const myBody = response.data;
myBody.places.forEach(place => {
console.log(place.displayName);
});
res.json(myBody); // Use res.json for JSON data
} catch (error) {
console.log('############### ERROR');
// console.error(error); // Log the detailed error for debugging
res.status(error.response.status).json(error.response.data); // Use res.json for errors too
}
}
// Configuration endpoint (send safe config data to the client)
app.get('/api/config', (req, res) => {
res.json({
mapsApiKey: process.env.MAPS_API_KEY,
recaptchaKey: process.env.RECAPTCHA_SITE_KEY,
});
});
// Serve static files
app.use(express.static('static'));
// Start the server
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server listening on port ${port}`, '\n');
});
7- تشغيل التطبيق
من البيئة التي اخترتها، يمكنك تشغيل الخادم من المحطة الطرفية والانتقال إلى http://localhost:3000.
npm start
يتم إنشاء رمز مميّز كمتغيّر عام، ويتم إخفاؤه عن نافذة متصفّح المستخدم، ويتم نقله إلى الخادم لمعالجته. يمكن العثور على تفاصيل الرمز المميّز في سجلّات الخادم. | يمكن العثور على تفاصيل حول وظائف الخادم والاستجابة لطلب البحث في الأماكن القريبة من خلال Places API في سجلات الخادم. |
تحديد المشاكل وحلّها:
تأكَّد من أنّ رقم تعريف مشروع Google متّسق في عملية الإعداد:
- في ملف .env (متغيّر GOOGLE_CLOUD_PROJECT)
- في إعدادات gcloud في المحطة الطرفية:
gcloud config set project your-project-id
- في إعدادات reCaptcha
- في عملية إعداد Firebase
غير ذلك
- أنشئ رمز أمان تصحيح الأخطاء الذي يمكن استخدامه بدلاً من مفتاح الموقع الإلكتروني في reCAPTCHA ضمن
script.js
لأغراض الاختبار وتحديد المشاكل وحلّها.
try {
// Initialize Firebase first
await firebase.initializeApp(firebaseConfig);
// Set the debug token
if (window.location.hostname === 'localhost') { // Only in development
await firebase.appCheck().activate(
'YOUR_DEBUG_FIREBASE_TOKEN', // Replace with the token from the console
true // Set to true to indicate it's a debug token
);
} else {
// Activate App Check
await firebase.appCheck().activate(recaptchaKey);
}
- قد يؤدي إجراء عدد كبير جدًا من محاولات المصادقة غير الناجحة، أي استخدام مفتاح موقع إلكتروني غير صحيح لـ recaptcha، إلى فرض قيود مؤقتة على عدد عمليات المصادقة.
FirebaseError: AppCheck: Requests throttled due to 403 error. Attempts allowed again after 01d:00m:00s (appCheck/throttled).
بيانات اعتماد ADC
- تأكَّد من أنّك تستخدم حساب gcloud الصحيح.
gcloud auth login
- تأكَّد من تثبيت المكتبات اللازمة.
npm install @googlemaps/places firebase-admin
- تأكَّد من تحميل مكتبة Firebase في server.js.
const {GoogleAuth} = require('google-auth-library');
- التطوير على الجهاز: ضبط "الاستجابة الإعلانية"
gcloud auth application-default login
- انتحال الهوية: تم حفظ بيانات اعتماد ADC
gcloud auth application-default login --impersonate-service-account your_project@appspot.gserviceaccount.com
- في النهاية، اختبِر أداة "إدارة البيانات في أماكن العمل" على الجهاز، واحفظ النص البرمجي التالي باسم test.js وشغِّله في Terminal:
node test.js
const {GoogleAuth} = require('google-auth-library');
async function requestTestADC() {
try {
// Authenticate using Application Default Credentials (ADC)
const auth = new GoogleAuth();
const {credential} = await auth.getApplicationDefault();
// Check if the credential is successfully obtained
if (credential) {
console.log('Application Default Credentials (ADC) loaded successfully!');
console.log('Credential:', credential); // Log the credential object
} else {
console.error('Error: Could not load Application Default Credentials (ADC).');
}
// ... rest of your code ...
} catch (error) {
console.error('Error:', error);
}
}
requestTestADC();
8. هذا كلّ ما عليك فعله. أحسنت.
خطوات المتابعة
النشر على App Engine:
- حضِّر مشروعك للنشر على Google App Engine، مع إجراء أي تغييرات ضرورية على الإعدادات.
- استخدِم أداة سطر الأوامر
gcloud
أو وحدة تحكّم App Engine لنشر تطبيقك.
تحسين مصادقة Firebase:
- الرموز التلقائية مقابل الرموز المخصّصة: يمكنك استخدام الرموز المخصّصة في Firebase للاستفادة بشكل أكبر من خدمات Firebase.
- مدة صلاحية الرمز المميّز: يمكنك ضبط مدد صلاحية الرموز المميّزة المناسبة، بحيث تكون أقصر للعمليات الحسّاسة (رمز Firebase المخصّص لمدة تصل إلى ساعة واحدة)، وأطول للجلسات العامة (رمز reCAPTCHA: من 30 دقيقة إلى 7 ساعات).
- استكشاف بدائل reCAPTCHA: يمكنك التحقيق في ما إذا كان DeviceCheck (لنظام التشغيل iOS) أو SafetyNet (لنظام التشغيل Android) أو App Attest مناسبًا لاحتياجات الأمان لديك.
دمج منتجات Firebase:
- Realtime Database أو Firestore: إذا كان تطبيقك يحتاج إلى مزامنة البيانات في الوقت الفعلي أو إمكانات العمل بلا إنترنت، يمكنك دمجه مع Realtime Database أو Firestore.
- مساحة التخزين في السحابة الإلكترونية: يمكنك استخدام مساحة التخزين في السحابة الإلكترونية لتخزين المحتوى الذي ينشئه المستخدمون وعرضه، مثل الصور أو الفيديوهات.
- المصادقة: يمكنك الاستفادة من Firebase Authentication لإنشاء حسابات المستخدمين وإدارة جلسات تسجيل الدخول ومعالجة عمليات إعادة ضبط كلمة المرور.
التوسيع ليشمل الأجهزة الجوّالة:
- Android وiOS: إذا كنت تخطّط لإنشاء تطبيق جوّال، أنشئ إصدارات لكل من نظامَي التشغيل Android وiOS.
- حِزم تطوير البرامج (SDK) لمنصّة Firebase: استخدِم حِزم تطوير البرامج (SDK) لمنصّة Firebase لنظامَي التشغيل Android وiOS لدمج ميزات Firebase بسلاسة في تطبيقاتك المتوافقة مع الأجهزة الجوّالة.