אימות בקשות REST

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

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

  1. אסימוני גישה של Google OAuth2 - בדרך כלל, היכולת לקרוא ולכתוב אל מסד הנתונים בזמן אמת נשלטת על ידי כללי מסד נתונים בזמן אמת . אבל, אתה יכול לגשת לנתונים שלך משרת ולהעניק לשרת זה גישת קריאה וכתיבה מלאה לנתונים שלך באמצעות אסימון גישה של Google OAuth2 שנוצר מחשבון שירות.

  2. אסימוני מזהה Firebase - ייתכן שתרצה גם לשלוח בקשות מאומתות כמשתמש בודד, כמו הגבלת גישה עם כללי מסד נתונים בזמן אמת ב-SDK של הלקוח. REST API מקבל את אותם אסימוני Firebase ID המשמשים את ערכות ה-SDK של הלקוח.

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

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

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

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

ממשק ה-RealTime Database REST API מקבל אסימוני גישה סטנדרטיים של Google OAuth2 . ניתן להפיק את אסימוני הגישה באמצעות חשבון שירות עם הרשאות מתאימות למסד הנתונים בזמן אמת שלך. לחיצה על הלחצן 'צור מפתח פרטי חדש' בתחתית הקטע ' חשבונות שירות ' של מסוף 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 עבור 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.

פִּיתוֹן

שימוש בספריית 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> בשם מסד הנתונים בזמן אמת ו- <ACCESS_TOKEN> באסימון גישה של Google OAuth2.

בקשה מוצלחת תצוין באמצעות קוד מצב HTTP 200 OK . התגובה מכילה את הנתונים שנשלפים:

{"first":"Ada","last":"Lovelace"}

אסימוני מזהה של Firebase

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

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

כדי לאחזר את אסימון ה-Firebase ID מהלקוח, בצע את השלבים ב'אחזור אסימוני מזהה בלקוחות' .

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

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

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

curl "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?auth=<ID_TOKEN>"

הקפד להחליף את <DATABASE_NAME> בשם מסד הנתונים בזמן אמת ו- <ID_TOKEN> באסימון מזהה Firebase.

בקשה מוצלחת תצוין באמצעות קוד מצב HTTP 200 OK . התגובה מכילה את הנתונים שנשלפים:

{"first":"Ada","last":"Lovelace"}

אסימונים מדור קודם

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

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

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