אימות בקשות REST

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

מאמתים את המשתמשים באחת מהשיטות הבאות:

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

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

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.

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