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

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

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

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

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

ממשק ה-API של Realtime Database REST מקבל אסימוני גישה רגילים מסוג 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.
  }
});

Java

שימוש ב-Google API Client Library for 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 בקטע Service Accounts במסוף Firebase.

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