مصادقة طلبات REST

تتعامل حِزم تطوير البرامج (SDK) لمنصة Firebase مع جميع عمليات المصادقة والاتصالات مع Firebase Realtime Database بالنيابة عنك. مع ذلك، إذا كنت في بيئة لا تتوفّر فيها حزمة تطوير البرامج (SDK) للعميل أو تريد تجنُّب عبء الاتصال المستمر بقاعدة البيانات، يمكنك الاستفادة من Realtime Database REST API لقراءة البيانات وكتابتها.

يمكنك المصادقة على المستخدمين بإحدى الطرق التالية:

  1. رموز Google OAuth2 للوصول: عادةً ما تخضع إمكانية القراءة من Realtime Database والكتابة فيها لقواعد Realtime Database. ومع ذلك، يمكنك الوصول إلى بياناتك من خادم ومنح هذا الخادم إذنًا كاملاً بقراءة بياناتك وكتابتها باستخدام رمز دخول Google OAuth2 الذي تم إنشاؤه من حساب الخدمة.

  2. رموز تعريف Firebase: قد تحتاج أيضًا إلى إرسال طلبات تمّت مصادقتها بصفتك مستخدمًا فرديًا، مثل تقييد الوصول باستخدام Realtime Database القواعد في حِزم تطوير البرامج (SDK) الخاصة بالعملاء. تقبل واجهة برمجة التطبيقات REST الرموز المميّزة نفسها لمعرّف Firebase والتي تستخدمها حِزم تطوير البرامج (SDK) للعملاء.

رموز دخول Google OAuth2

يمكن أيضًا قراءة أي بيانات قابلة للقراءة أو الكتابة بشكل علني وفقًا لقواعد Realtime Database الخاصة بك، وذلك من خلال واجهة برمجة التطبيقات REST API بدون أي مصادقة. ومع ذلك، إذا كنت تريد أن يتجاوز خادمك Realtime Database القواعد، عليك مصادقة طلبات القراءة والكتابة. تتطلب المصادقة عبر Google OAuth2 تنفيذ الخطوات التالية:

  1. أنشئ رمزًا مميزًا للوصول.
  2. يمكنك المصادقة باستخدام رمز الدخول هذا.

إنشاء رمز دخول

تقبل Realtime Database REST API رموز Google OAuth2 الوصول المميزة. ويمكن إنشاء رموز الدخول باستخدام حساب خدمة لديه الأذونات المناسبة للوصول إلى Realtime Database. يتيح لك النقر على الزر إنشاء مفتاح دوار جديد في أسفل القسم حسابات الخدمة في وحدة تحكّم Firebase إنشاء ملف مفتاح حساب الخدمة الجديد بسهولة إذا لم يكن لديك ملف حالي.

بعد الحصول على ملف مفتاح حساب الخدمة، يمكنك استخدام إحدى مكتبات عملاء Google API لإنشاء رمز مميز للوصول عبر بروتوكول Google OAuth2 باستخدام النطاقات المطلوبة التالية:

  • https://www.googleapis.com/auth/userinfo.email
  • https://www.googleapis.com/auth/firebase.database

في ما يلي بعض أمثلة عمليات التنفيذ التي توضّح كيفية إنشاء رموزها المميّزة للوصول إلى Google OAuth2 لمصادقة Realtime Database REST API بمجموعة متنوعة من اللغات:

Node.js

باستخدام مكتبة برامج Google API لأجل Node.js:

var {google} = require("googleapis");

// Load the service account key JSON file.
var serviceAccount = require("path/to/serviceAccountKey.json");

// Define the required scopes.
var scopes = [
  "https://www.googleapis.com/auth/userinfo.email",
  "https://www.googleapis.com/auth/firebase.database"
];

// Authenticate a JWT client with the service account.
var jwtClient = new google.auth.JWT(
  serviceAccount.client_email,
  null,
  serviceAccount.private_key,
  scopes
);

// Use the JWT client to generate an access token.
jwtClient.authorize(function(error, tokens) {
  if (error) {
    console.log("Error making request to generate access token:", error);
  } else if (tokens.access_token === null) {
    console.log("Provided service account does not have permission to generate access tokens");
  } else {
    var accessToken = tokens.access_token;

    // See the "Using the access token" section below for information
    // on how to use the access token to send authenticated requests to
    // the Realtime Database REST API.
  }
});

جافا

باستخدام مكتبة برامج واجهة برمجة التطبيقات من Google لأجل Java:

// Load the service account key JSON file
FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

// Authenticate a Google credential with the service account
GoogleCredential googleCred = GoogleCredential.fromStream(serviceAccount);

// Add the required scopes to the Google credential
GoogleCredential scoped = googleCred.createScoped(
    Arrays.asList(
      "https://www.googleapis.com/auth/firebase.database",
      "https://www.googleapis.com/auth/userinfo.email"
    )
);

// Use the Google credential to generate an access token
scoped.refreshToken();
String token = scoped.getAccessToken();

// See the "Using the access token" section below for information
// on how to use the access token to send authenticated requests to the
// Realtime Database REST API.

Python

باستخدام مكتبة google-auth:

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession

# Define the required scopes
scopes = [
  "https://www.googleapis.com/auth/userinfo.email",
  "https://www.googleapis.com/auth/firebase.database"
]

# Authenticate a credential with the service account
credentials = service_account.Credentials.from_service_account_file(
    "path/to/serviceAccountKey.json", scopes=scopes)

# Use the credentials object to authenticate a Requests session.
authed_session = AuthorizedSession(credentials)
response = authed_session.get(
    "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json")

# Or, use the token directly, as described in the "Authenticate with an
# access token" section below. (not recommended)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
access_token = credentials.token

المصادقة باستخدام رمز دخول

لإرسال طلبات تمّت مصادقتها إلى واجهة برمجة التطبيقات Realtime Database REST API، عليك تمرير رمز دخول Google OAuth2 المميّز الذي تم إنشاؤه أعلاه كعنوان Authorization: Bearer <ACCESS_TOKEN> أو مَعلمة سلسلة طلب البحث access_token=<ACCESS_TOKEN>. في ما يلي مثال على curl طلب لقراءة اسم "آمنة":

curl "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?access_token=<ACCESS_TOKEN>"

احرص على استبدال <DATABASE_NAME> باسم Realtime Database و<ACCESS_TOKEN> برمز الوصول إلى Google OAuth2.

ويُشار إلى الطلب الناجح باستخدام رمز حالة HTTP 200 OK. يتضمن الرد البيانات التي يتم استردادها:

{"first":"Ada","last":"Lovelace"}

رموز تعريف Firebase

عندما يسجّل مستخدم أو جهاز الدخول باستخدام Firebase Authentication، تنشئ Firebase رمز تعريف متوافقًا يحدّد هويته بشكل فريد ويمنحه إذن الوصول إلى العديد من الموارد، مثل Realtime Database وCloud Storage. يمكنك إعادة استخدام رمز التعريف هذا لمصادقة واجهة برمجة التطبيقات Realtime Database REST API وتقديم طلبات نيابةً عن هذا المستخدم.

إنشاء رمز تعريف

لاسترداد رمز تعريف Firebase من العميل، اتّبِع الخطوات الواردة في مقالة استرداد رموز التعريف على العملاء.

يُرجى العِلم أنّ مدة صلاحية الرموز المميّزة للتعريف تنتهي بعد فترة زمنية قصيرة، ويجب استخدامها في أسرع وقت ممكن بعد استرجاعها.

المصادقة باستخدام رمز مميّز للتعريف

لإرسال الطلبات التي تمت مصادقتها إلى واجهة برمجة تطبيقات REST Realtime Database، استخدِم رمز المعرّف المميّز الذي تم إنشاؤه أعلاه كمَعلمة سلسلة طلب البحث auth=<ID_TOKEN>. في ما يلي مثال على طلب curl لقراءة اسم "آية":

curl "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?auth=<ID_TOKEN>"

احرص على استبدال <DATABASE_NAME> باسم Realtime Database و<ID_TOKEN> برمز تعريف Firebase.

ويُشار إلى الطلب الناجح باستخدام رمز حالة HTTP 200 OK. يتضمن الرد البيانات التي يتم استردادها:

{"first":"Ada","last":"Lovelace"}

الرموز المميّزة القديمة

إذا كنت لا تزال تستخدم الرموز المميّزة القديمة لمصادقة Firebase، ننصحك بتعديل مصادقة REST إلى إحدى طرق المصادقة الموضّحة أعلاه.

لا تزال واجهة Realtime Database REST API تتيح المصادقة من خلال الرموز المميزة للمصادقة القديمة، بما في ذلك السِرّ. يمكن العثور على أسرار Realtime Database في قسم حسابات الخدمة في وحدة تحكّم Firebase.

الأسرار هي بيانات اعتماد صالحة لفترة طويلة. نقترح إنشاء مفتاح سرّي جديد وإلغاء المفتاح الحالي عند إزالة مستخدمين لديهم إذن وصول سري (مثل المالكين) من مشروع.