ערכות ה-SDK של Firebase מטפלות בכל תהליך האימות והתקשורת עם Firebase Realtime Database בשמכם. עם זאת, אם אתם נמצאים בסביבה שאין בה ערכת SDK ללקוח או אם אתם רוצים להימנע מהעלות הנוספת של חיבור קבוע למסד נתונים, תוכלו להשתמש ב-Realtime Database REST API כדי לקרוא ולכתוב נתונים.
אימות משתמשים באחת מהשיטות הבאות:
אסימוני גישה מסוג Google OAuth2 – בדרך כלל, היכולת לקרוא מ-Realtime Database ולכתוב אליו כפופה לכללי Realtime Database. עם זאת, אפשר לגשת לנתונים שלכם משרת ולתת לשרת הזה הרשאת קריאה וכתיבה מלאה לנתונים באמצעות אסימון גישה מסוג Google OAuth2 שנוצר מחשבון שירות.
אסימוני מזהה של Firebase – יכול להיות שתרצו גם לשלוח בקשות שמאומתות כמשתמש ספציפי, למשל הגבלת הגישה באמצעות כללי Realtime Database ב-SDK של הלקוח. ה-API ל-REST מקבל את אותם אסימוני מזהה של Firebase שבהם נעשה שימוש ב-SDK של הלקוח.
אסימוני גישה מסוג Google OAuth2
כל נתון שגלוי לכולם לקריאה או לכתיבה בהתאם לכללי Realtime Database שלכם, ניתן לקריאה ולכתיבה גם דרך ה-API ל-REST ללא אימות. עם זאת, אם רוצים שהשרת יעקוף את כללי Realtime Database, צריך לאמת את בקשות הקריאה והכתיבה. כדי לבצע אימות באמצעות Google OAuth2, צריך לבצע את השלבים הבאים:
- יוצרים אסימון גישה.
- מבצעים אימות באמצעות אסימון הגישה הזה.
יצירת אסימון גישה
ה-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.
סודות הם פרטי כניסה לטווח ארוך. כשמסירים מפרויקט משתמשים עם גישה סודית (כמו בעלים), מומלץ ליצור סוד חדש ולבטל את הסוד הקיים.