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 ソースファイルに整理する場合は、管理オペレーションに認可アクセスレベルを付けないか、明示的に 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);

次のステップ