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

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

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

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

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

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

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

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

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

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

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

{"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

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

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

โทเค็นเดิม

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

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

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