مصادقة طلبات 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 من العميل، اتّبِع الخطوات الواردة في مقالة استرداد رموز التعريف على العملاء.

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

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

لإرسال طلبات مصادق عليها إلى واجهة برمجة التطبيقات Realtime Database REST API، عليك تمرير رمز تمييز العميل الذي تم إنشاؤه أعلاه كمَعلمة سلسلة طلب البحث 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.

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