搭配 Data Connect 使用 Admin SDK

Firebase Admin SDK 是一組伺服器程式庫,可讓您在特權環境中與 Firebase 互動,執行查詢和變異等動作,以便管理大量資料,並透過提升的權限和冒用憑證執行其他作業。Firebase Data Connect

Admin SDK 提供 API,可在讀/寫和唯讀模式下呼叫作業。透過唯讀作業,您可以放心實作無法修改資料庫中資料的管理功能。

Admin SDK 設定

如要在伺服器上使用 Firebase Data Connect,您必須先安裝並設定 Node.js 適用的 Admin SDK

在指令碼中初始化 Admin SDK

如要初始化 SDK,請匯入 Data Connect 擴充功能,並宣告專案服務 ID 和位置。


import { initializeApp } from 'firebase-admin/app';
import { getDataConnect } from 'firebase-admin/data-connect';

// If you'd like to use OAuth2 flows and other credentials to log in,
// visit https://firebase.google.com/docs/admin/setup#initialize-sdk
// for alternative ways to initialize the SDK.

const app = initializeApp();

const dataConnect = getDataConnect({
    serviceId: 'serviceId',
    location: 'us-west2'
});

設計要與 Admin SDK 搭配使用的查詢和異動

Admin SDK 可用於測試 Data Connect 作業,但請考量下列事項。

瞭解 SDK 和 @auth(level: NO_ACCESS) 作業指令

由於 Admin SDK 會以權限運作,因此無論使用 @auth 指示詞設定的存取層級為何 (包括 NO_ACCESS 層級),它都能執行任何查詢和突變。

如果您在用戶端作業中,將管理查詢和變異 .gql 來源檔案中的排序匯入管理指令碼,Firebase 建議您標示管理作業,但不指定任何授權存取層級,或者您也可以更明確地將其設為 NO_ACCESS。無論如何,這項功能可防止此類作業從用戶端或其他非特權內容中執行。

搭配 Data Connect 模擬器使用 SDK

在原型和測試環境中,對本機資料執行資料播種和其他作業可能會很有幫助。Admin SDK 會忽略本機流程的驗證和授權,因此可簡化工作流程。

設定 DATA_CONNECT_EMULATOR_HOST 環境變數後,Firebase Admin SDK 會自動連線至 Data Connect 模擬器:

export DATA_CONNECT_EMULATOR_HOST="127.0.0.1:9399"

詳情請參閱:

實作常見用途

Admin SDK 可用於對重要資料執行特權作業。

Data Connect 的 API 包含讀寫 executeGraphql 介面和唯讀 executeGraphqlRead 介面。

管理使用者資料

Admin SDK 的常見用途是管理使用者資料。

使用管理員憑證

最簡單的方法是使用管理員憑證存取使用者資料。

// User can be publicly accessible, or restricted to admins
const query = "query getProfile(id: AuthID) { user(id: $id) { id name } }";

interface UserData {
  user: {
    id: string;
    name: string;
  };
}

export interface UserVariables {
  id: string;
}

const options:GraphqlOptions<UserVariables> = { variables: { id: "QVBJcy5ndXJ1" } };

// executeGraphql
const gqlResponse = await dataConnect.executeGraphql<UserData, UserVariables>(query, options);

// executeGraphqlRead (similar to previous sample but only for read operations)
const gqlResponse = await dataConnect.executeGraphqlRead<UserData, UserVariables>(query, options);

// gqlResponse -> { "data": { "user": { "id": "QVBJcy5ndXJ1", "name": "Fred" } } }

模擬使用者憑證

在某些情況下,您可能會希望指令碼代表特定使用者,根據有限的憑證修改使用者資料。這種做法符合最低權限原則。

如要使用這個介面,請從符合 Authentication 權杖格式的自訂 JWT 驗證權杖中收集資訊。另請參閱自訂符記指南

// Get the current user's data
const queryGetUserImpersonation = `
    query getUser @auth(level: USER) {
        user(key: {uid_expr: "auth.uid"}) {
            id,
            name
        }
    }`;

// Impersonate a user with the specified auth claims
const optionsAuthenticated: GraphqlOptions<undefined> = {
    impersonate: {
        authClaims: {
            sub: 'QVBJcy5ndXJ1'
        }
    }
};

// executeGraphql with impersonated authenticated user scope
const gqlResponse = await dataConnect.executeGraphql<UserData, undefined>(queryGetUserImpersonation, optionsAuthenticated);

// gqlResponse -> { "data": { "user": { "id": "QVBJcy5ndXJ1", "name": "Fred" } } }

管理公開資料

您可以使用 SDK 處理公開可存取的資料,並模擬未經驗證的使用者。

// Query to get posts, with authentication level PUBLIC
const queryGetPostsImpersonation = `
    query getPosts @auth(level: PUBLIC) {
        posts {
          description
        }
    }`;

// Attempt to access data as an unauthenticated user
const optionsUnauthenticated: GraphqlOptions<undefined> = {
    impersonate: {
        unauthenticated: true
    }
};

// executeGraphql with impersonated unauthenticated user scope
const gqlResponse = await dataConnect.executeGraphql<UserData, undefined>(queryGetPostsImpersonation, optionsUnauthenticated);

後續步驟