אימות בקשות 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, צריך לאמת את בקשות הקריאה והכתיבה. כדי לבצע אימות באמצעות Google OAuth2, צריך לבצע את השלבים הבאים:

  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 לקריאת השם של Ada:

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.

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