אימות בקשות 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 של הלקוח. ה-API ל-REST מקבל את אותם אסימונים מזהים של Firebase שמשמשים את ערכות ה-SDK של הלקוח.

אסימוני גישה מסוג Google OAuth2

כל הנתונים שזמינים באופן ציבורי לקריאה או לכתיבה בהתאם לכללי Realtime Database שלכם גם ניתנים לקריאה ולכתיבה דרך API ל-REST ללא אימות. עם זאת, אם רוצים שהשרת יעקוף את כללי Realtime Database, צריך לאמת את בקשות הקריאה והכתיבה. אימות באמצעות OAuth2 של Google מחייב את השלבים הבאים:

  1. יוצרים אסימון גישה.
  2. מבצעים אימות באמצעות אסימון הגישה הזה.

יצירת אסימון גישה

ה-API ל-REST של Realtime Database מקבל אסימוני גישה רגילים של Google OAuth2. אפשר ליצור את אסימוני הגישה באמצעות חשבון שירות עם ההרשאות המתאימות ל-Realtime Database. לחיצה על הלחצן Generate New Private Key (יצירת מפתח פרטי חדש) שבחלק התחתון של הקטע Service Accounts במסוף Firebase מאפשרת ליצור בקלות קובץ מפתח חדש של חשבון שירות, אם עדיין אין לכם כזה.

אחרי שיוצרים קובץ מפתח של חשבון שירות, אפשר להשתמש באחת מספריות הלקוח של Google API כדי ליצור אסימון גישה מסוג Google OAuth2 עם ההיקפים הנדרשים הבאים:

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

ריכזנו כאן כמה דוגמאות להטמעה שממחישות איך יוצרים אסימוני גישה של Google OAuth2 כדי לבצע אימות ב-API ל-REST של Realtime Database במגוון שפות:

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.
  }
});

Java

באמצעות ספריית הלקוח של Google API ל-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

אימות באמצעות אסימון גישה

כדי לשלוח בקשות מאומתות ל-API ל-REST‏ Realtime Database, מעבירים את אסימון הגישה של 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. אפשר לעשות שימוש חוזר באסימון המזהה הזה כדי לאמת את ה-API ל-REST של Realtime Database ולשלוח בקשות בשם המשתמש הזה.

יצירת אסימון מזהה

כדי לאחזר את אסימון המזהה של Firebase מהלקוח, פועלים לפי השלבים המפורטים במאמר אחזור אסימוני מזהה בלקוחות.

חשוב לזכור שתוקף האסימונים המזהים פג אחרי פרק זמן קצר, ויש להשתמש בהם בהקדם האפשרי אחרי אחזורם.

אימות באמצעות אסימון מזהה

כדי לשלוח בקשות מאומתות ל-API ל-REST של Realtime Database, מעבירים את אסימון המזהה שנוצר למעלה כפרמטר של מחרוזת השאילתה auth=<ID_TOKEN>. זוהי דוגמה לבקשת curl לקריאת השם של Ada:

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 לאחת משיטות האימות שמתוארות למעלה.

ה-API ל-REST של Realtime Database עדיין תומך באימות באמצעות אסימוני אימות מדור קודם, כולל סודות. הסודות של Realtime Database נמצאים בקטע Service Accounts במסוף Firebase.

סודות הם פרטי כניסה לטווח ארוך. מומלץ ליצור סוד חדש ולבטל את הסוד הקיים כשמסירים ממשתמשים גישה לסוד (כמו בעלים) בפרויקט.