ตรวจสอบสิทธิ์คำขอ REST

Firebase SDK จะจัดการการตรวจสอบสิทธิ์และการสื่อสารทั้งหมดกับ Firebase Realtime Database ในนามของคุณ อย่างไรก็ตาม เมื่ออยู่ใน สภาพแวดล้อมที่ไม่มี SDK ของไคลเอ็นต์ หรือต้องการหลีกเลี่ยงค่าใช้จ่ายเพิ่มเติมของ การเชื่อมต่อฐานข้อมูลแบบถาวร คุณสามารถใช้ Realtime Database REST API เพื่ออ่านและเขียนข้อมูลได้

ตรวจสอบสิทธิ์ผู้ใช้ผ่านวิธีใดวิธีหนึ่งต่อไปนี้

  1. โทเค็นเพื่อการเข้าถึง Google OAuth2 - โดยปกติแล้ว ความสามารถในการอ่านและเขียนไปยัง Realtime Database จะควบคุมโดยRealtime Database Rules แต่คุณสามารถเข้าถึงข้อมูล จากเซิร์ฟเวอร์และให้สิทธิ์การอ่านและการเขียนอย่างเต็มรูปแบบแก่เซิร์ฟเวอร์นั้นเพื่อเข้าถึงข้อมูล ของคุณได้ด้วยโทเค็นเพื่อการเข้าถึง Google OAuth2 ที่สร้างจากบัญชีบริการ

  2. โทเค็นรหัส Firebase - คุณอาจต้องการส่งคำขอที่ได้รับการตรวจสอบสิทธิ์ ในฐานะผู้ใช้แต่ละราย เช่น การจำกัดการเข้าถึงด้วยRealtime Database กฎใน SDK ของไคลเอ็นต์ REST API ยอมรับโทเค็นรหัส Firebase เดียวกันกับที่ SDK ของไคลเอ็นต์ใช้

โทเค็นเพื่อการเข้าถึง Google OAuth2

ข้อมูลใดก็ตามที่อ่านหรือเขียนได้แบบสาธารณะตามRealtime Databaseกฎของคุณจะอ่านและเขียนได้ ผ่าน REST API โดยไม่ต้องมีการตรวจสอบสิทธิ์ อย่างไรก็ตาม หากต้องการให้เซิร์ฟเวอร์ ข้ามRealtime Databaseกฎ คุณต้องตรวจสอบสิทธิ์คำขออ่านและเขียน การตรวจสอบสิทธิ์ผ่าน Google OAuth2 ต้องทำตามขั้นตอนต่อไปนี้

  1. สร้างโทเค็นเพื่อการเข้าถึง
  2. ตรวจสอบสิทธิ์ด้วยโทเค็นเพื่อการเข้าถึงนั้น

สร้างโทเค็นเพื่อการเข้าถึง

Realtime Database REST API ยอมรับโทเค็นการเข้าถึง OAuth2 ของ Google มาตรฐาน คุณสร้างโทเค็นเพื่อเข้าถึงได้โดยใช้บัญชีบริการที่มีสิทธิ์ที่เหมาะสมกับ 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 สำหรับ 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 คำขอให้อ่านชื่อของ Ada มีดังนี้

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

อย่าลืมแทนที่ <DATABASE_NAME> ด้วยชื่อของRealtime Database และแทนที่ <ACCESS_TOKEN> ด้วยโทเค็นเพื่อการเข้าถึง OAuth2 ของ Google

คำขอที่สำเร็จจะระบุด้วย200 OKรหัสสถานะ HTTP การตอบกลับมีข้อมูลที่ดึงมาดังนี้

{"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คำขออ่านชื่อของ Ada มีดังนี้

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

อย่าลืมแทนที่ <DATABASE_NAME> ด้วยชื่อ Realtime Database และแทนที่ <ID_TOKEN> ด้วยโทเค็นรหัส Firebase

คำขอที่สำเร็จจะระบุด้วย200 OKรหัสสถานะ HTTP การตอบกลับมีข้อมูลที่ดึงมาดังนี้

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

โทเค็นเดิม

หากยังคงใช้โทเค็นการตรวจสอบสิทธิ์ Firebase รุ่นเดิมอยู่ เราขอแนะนำให้ อัปเดตการตรวจสอบสิทธิ์ REST เป็นวิธีการตรวจสอบสิทธิ์วิธีใดวิธีหนึ่งที่อธิบายไว้ ข้างต้น

Realtime Database REST API ยังคงรองรับการตรวจสอบสิทธิ์ผ่านโทเค็นการตรวจสอบสิทธิ์เดิม ซึ่งรวมถึงข้อมูลลับ คุณดูRealtime Databaseข้อมูลลับได้ใน ส่วน บัญชีบริการ ของคอนโซล Firebase

Secret คือข้อมูลเข้าสู่ระบบที่มีอายุการใช้งานยาวนาน เราขอแนะนำให้สร้างข้อมูลลับใหม่และ เพิกถอนข้อมูลลับที่มีอยู่เมื่อนำผู้ใช้ที่มีสิทธิ์เข้าถึงลับ (เช่น เจ้าของ) ออกจากโปรเจ็กต์