احراز هویت درخواست های REST

کیت‌های توسعه نرم‌افزار (SDK) فایربیس (Firebase SDK) تمام احراز هویت و ارتباط با Firebase Realtime Database را از طرف شما مدیریت می‌کنند. با این حال، وقتی در محیطی هستید که SDK کلاینت ندارد یا می‌خواهید از سربار اتصال مداوم به پایگاه داده جلوگیری کنید، می‌توانید از API REST Realtime Database برای خواندن و نوشتن داده‌ها استفاده کنید.

احراز هویت کاربران از طریق یکی از روش‌های زیر:

  1. توکن‌های دسترسی Google OAuth2 - معمولاً قابلیت خواندن و نوشتن در Realtime Database توسط قوانین Realtime Database اداره می‌شود. اما می‌توانید از طریق یک سرور به داده‌های خود دسترسی داشته باشید و با یک توکن دسترسی Google OAuth2 که از یک حساب سرویس تولید می‌شود، به آن سرور دسترسی کامل خواندن و نوشتن به داده‌های خود را اعطا کنید.

  2. توکن‌های شناسه فایربیس - همچنین ممکن است بخواهید درخواست‌هایی را ارسال کنید که به عنوان یک کاربر واحد تأیید شده‌اند، مانند محدود کردن دسترسی با قوانین Realtime Database در SDKهای کلاینت. REST API همان توکن‌های شناسه فایربیس مورد استفاده توسط SDKهای کلاینت را می‌پذیرد.

توکن‌های دسترسی Google OAuth2

هر داده‌ای که طبق قوانین Realtime Database شما قابل خواندن یا نوشتن عمومی باشد، از طریق REST API نیز بدون هیچ گونه احراز هویتی قابل خواندن و نوشتن است. با این حال، اگر می‌خواهید سرور شما قوانین Realtime Database شما را دور بزند، باید درخواست‌های خواندن و نوشتن خود را احراز هویت کنید. احراز هویت از طریق Google OAuth2 به مراحل زیر نیاز دارد:

  1. یک توکن دسترسی ایجاد کنید.
  2. با آن توکن دسترسی، احراز هویت کنید.

ایجاد یک توکن دسترسی

API Realtime Database REST توکن‌های دسترسی استاندارد Google OAuth2 را می‌پذیرد. توکن‌های دسترسی را می‌توان با استفاده از یک حساب کاربری سرویس با مجوزهای مناسب برای Realtime Database شما ایجاد کرد. کلیک بر روی دکمه Generate New Private Key در پایین بخش Service Accounts کنسول Firebase به شما این امکان را می‌دهد که در صورت نداشتن فایل کلید حساب کاربری سرویس، به راحتی آن را ایجاد کنید.

زمانی که فایل کلید حساب سرویس را دارید، می‌توانید از یکی از کتابخانه‌های کلاینت API گوگل برای تولید توکن دسترسی Google OAuth2 با دامنه‌های مورد نیاز زیر استفاده کنید:

  • https://www.googleapis.com/auth/userinfo.email
  • https://www.googleapis.com/auth/firebase.database

در اینجا چند نمونه پیاده‌سازی ارائه شده است که نحوه ایجاد توکن‌های دسترسی Google OAuth2 را برای احراز هویت در Realtime Database REST API به زبان‌های مختلف نشان می‌دهد:

نود جی اس

استفاده از کتابخانه کلاینت 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.
  }
});

جاوا

استفاده از کتابخانه کلاینت API گوگل برای جاوا :

// 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 برای خواندن نام 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 Authentication وارد سیستم می‌شود، Firebase یک شناسه توکن مربوطه ایجاد می‌کند که به طور منحصر به فرد آنها را شناسایی می‌کند و به آنها امکان دسترسی به منابع مختلفی مانند Realtime Database و Cloud Storage را می‌دهد. می‌توانید از آن شناسه توکن برای احراز هویت Realtime Database REST API و ارسال درخواست‌ها از طرف آن کاربر، دوباره استفاده کنید.

یک توکن شناسایی ایجاد کنید

برای بازیابی توکن Firebase ID از کلاینت، مراحل موجود در بخش «بازیابی توکن‌های ID روی کلاینت‌ها» را دنبال کنید.

توجه داشته باشید که توکن‌های شناسایی پس از مدت کوتاهی منقضی می‌شوند و باید پس از بازیابی، در اسرع وقت مورد استفاده قرار گیرند.

احراز هویت با توکن شناسایی

برای ارسال درخواست‌های احراز هویت شده به Realtime Database REST API، توکن ID تولید شده در بالا را به عنوان پارامتر رشته پرس و جو 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 ID جایگزین کنید.

یک درخواست موفق با کد وضعیت HTTP 200 OK نشان داده می‌شود. پاسخ شامل داده‌هایی است که بازیابی می‌شوند:

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

توکن‌های قدیمی

اگر هنوز از توکن‌های احراز هویت قدیمی Firebase استفاده می‌کنید، توصیه می‌کنیم احراز هویت REST خود را به یکی از روش‌های احراز هویت توضیح داده شده در بالا به‌روزرسانی کنید.

API REST Realtime Database هنوز از احراز هویت از طریق توکن‌های احراز هویت قدیمی، از جمله رمزها ، پشتیبانی می‌کند. رمزهای Realtime Database شما را می‌توانید در بخش حساب‌های سرویس (Service Accounts) کنسول Firebase پیدا کنید.

رازها، اعتبارنامه‌های با طول عمر بالا هستند. توصیه می‌کنیم هنگام حذف کاربران با دسترسی مخفی (مانند مالکان) از یک پروژه، یک راز جدید ایجاد کرده و راز موجود را لغو کنید.