ডাটা কানেক্টের সাথে অ্যাডমিন SDK ব্যবহার করুন, ডাটা কানেক্টের সাথে অ্যাডমিন SDK ব্যবহার করুন

The Firebase Admin SDK is a set of server libraries that lets you interact with Firebase from privileged environments to perform actions like performing queries and mutations on a Firebase Data Connect service for bulk data management and other operations with elevated privileges and impersonated credentials.

The Admin SDK provides you with an API to call operations in both read/write and read-only modes. With the read-only operations, you have the peace of mind of implementing administrative functions that cannot modify data in your databases.

অ্যাডমিন এসডিকে সেটআপ

আপনার সার্ভারে Firebase Data Connect ব্যবহার শুরু করতে, আপনাকে প্রথমে Node.js-এর জন্য Admin SDK ) ইনস্টল এবং সেট আপ করতে হবে।

আপনার স্ক্রিপ্টগুলিতে অ্যাডমিন এসডিকে চালু করুন

SDK চালু করতে, Data Connect এক্সটেনশনগুলো ইম্পোর্ট করুন এবং আপনার প্রোজেক্ট সার্ভিস আইডি ও অবস্থান ঘোষণা করুন।


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 সাথে ব্যবহারের জন্য কোয়েরি এবং মিউটেশন ডিজাইন করুন

নিম্নলিখিত বিষয়গুলো বিবেচনায় রাখলে, Data Connect অপারেশনগুলো চালানোর জন্য Admin SDK উপযোগী।

SDK এবং @auth(level: NO_ACCESS) অপারেশন নির্দেশিকাটি বুঝুন।

যেহেতু Admin SDK বিশেষাধিকার নিয়ে কাজ করে, তাই এটি @auth নির্দেশিকা ব্যবহার করে সেট করা অ্যাক্সেস লেভেল, এমনকি NO_ACCESS লেভেল নির্বিশেষে, আপনার যেকোনো কোয়েরি এবং মিউটেশন সম্পাদন করতে পারে।

যদি আপনার ক্লায়েন্ট অপারেশনের পাশাপাশি, আপনি অ্যাডমিনিস্ট্রেটিভ স্ক্রিপ্টে ইম্পোর্ট করার জন্য আপনার অ্যাডমিনিস্ট্রেটিভ কোয়েরি এবং মিউটেশনগুলিকে .gql সোর্স ফাইলে সাজিয়ে রাখেন, তাহলে Firebase পরামর্শ দেয় যে আপনি অ্যাডমিনিস্ট্রেটিভ অপারেশনগুলিকে কোনো অথরাইজেশন অ্যাক্সেস লেভেল ছাড়াই চিহ্নিত করুন, অথবা আরও সুস্পষ্টভাবে সেগুলিকে NO_ACCESS হিসাবে সেট করুন। উভয় ক্ষেত্রেই, এটি ক্লায়েন্ট থেকে বা অন্যান্য নন-প্রিভিলেজড প্রেক্ষাপটে এই ধরনের অপারেশনগুলি চালানো থেকে বিরত রাখে।

Data Connect এমুলেটরের সাথে SDK ব্যবহার করুন

In prototype and test environments, it can be useful to perform data seeding and other operations on local data. The Admin SDK lets you simplify your workflows since it can ignore authentication and authorization for local flows. (You can also explicitly opt in to complying with your operations' authentication and authorization configuration with user impersonation.)

যখন DATA_CONNECT_EMULATOR_HOST এনভায়রনমেন্ট ভেরিয়েবলটি সেট করা থাকে, তখন Firebase Admin SDK-গুলো স্বয়ংক্রিয়ভাবে Data Connect এমুলেটরের সাথে সংযুক্ত হয়।

export DATA_CONNECT_EMULATOR_HOST="127.0.0.1:9399"

আরও তথ্যের জন্য দেখুন:

অ্যাডমিন অপারেশন চালান

আপনার গুরুত্বপূর্ণ ডেটার উপর বিশেষাধিকারপ্রাপ্ত কার্যক্রম পরিচালনার জন্য Admin SDK প্রদান করা হয়।

অ্যাডমিন এসডিকে তিন সেট এপিআই প্রদান করে:

  • জেনারেটেড অ্যাডমিন SDK-গুলো হলো টাইপ-সেফ SDK, যা আপনার gql ডেফিনিশন থেকে ঠিক সেইভাবেই জেনারেট করা হয়, যেভাবে আপনি ক্লায়েন্ট SDK জেনারেট করেন।
  • A general interface for running arbitrary GraphQL operations, in which your code implements queries and mutations and passes them to the read-write executeGraphql method or the read-only executeGraphqlRead method.
  • বাল্ক ডেটা অপারেশনের জন্য একটি বিশেষায়িত ইন্টারফেস, যা সাধারণ executeGraphql মেথডের পরিবর্তে মিউটেশন অপারেশনের জন্য ডেডিকেটেড মেথড প্রদান করে: insert , insertMany , upsert , এবং upsertMany

জেনারেট করা SDK ব্যবহার করে ডেটা পরিচালনা করুন

যেভাবে ক্লায়েন্ট SDK তৈরি করেন, ঠিক সেইভাবেই আপনার gql ডেফিনিশনগুলো থেকে অ্যাডমিন SDK তৈরি করতে পারেন।

The generated admin SDK contains interfaces and functions that correspond with your gql definitions, which you can use to perform operations on your database. For example, suppose you generated an SDK for a database of songs, along with a query, getSongs :

import { initializeApp } from "firebase-admin/app";
import { getSongs } from "@dataconnect/admin-generated";

const adminApp = initializeApp();

const songs = await getSongs(
  { limit: 4 },
  { impersonate: { unauthenticated: true } }
);

অথবা, একটি সংযোগকারী কনফিগারেশন নির্দিষ্ট করতে:

import { initializeApp } from "firebase-admin/app";
import { getDataConnect } from "firebase-admin/data-connect";
import {
  connectorConfig,
  getSongs,
} from "@dataconnect/admin-generated";

const adminApp = initializeApp();
const adminDc = getDataConnect(connectorConfig);

const songs = await getSongs(
  adminDc,
  { limit: 4 },
  { impersonate: { unauthenticated: true } }
);

অপ্রমাণিত ব্যবহারকারীর ছদ্মবেশ ধারণ করা

অ্যাডমিন এসডিকে-গুলো বিশ্বস্ত পরিবেশ থেকে চালানোর জন্য তৈরি করা হয়েছে, এবং সেই কারণে আপনার ডেটাবেসগুলোতে এগুলোর অবাধ অ্যাক্সেস রয়েছে।

When you run public operations with the admin SDK, you should avoid running the operation with full administrator privileges (following the principle of least privilege). Instead, you should run the operation either as an impersonated user (see the next section), or as an impersonated unauthenticated user. Unauthenticated users can only run operations marked as PUBLIC .

উপরের উদাহরণে, getSongs কোয়েরিটি একজন প্রমাণীকরণবিহীন ব্যবহারকারী হিসেবে চালানো হয়েছে।

একজন ব্যবহারকারীর ছদ্মবেশ ধারণ করা

আপনি impersonate অপশনে একটি Firebase Authentication টোকেনের অংশবিশেষ বা সম্পূর্ণটি পাস করে নির্দিষ্ট ব্যবহারকারীদের পক্ষ থেকেও অপারেশন সম্পাদন করতে পারেন; ন্যূনতমপক্ষে, আপনাকে sub claim-এ ব্যবহারকারীর ইউজার আইডি অবশ্যই উল্লেখ করতে হবে। (এই মানটি auth.uid সার্ভার ভ্যালুর মতোই, যা আপনি Data Connect GraphQL অপারেশনগুলিতে রেফারেন্স হিসেবে ব্যবহার করতে পারেন।)

যখন আপনি কোনো ব্যবহারকারীর ছদ্মবেশ ধারণ করেন, তখন অপারেশনটি তখনই সফল হবে, যদি আপনার দেওয়া ব্যবহারকারীর ডেটা আপনার GraphQL সংজ্ঞায় নির্দিষ্ট করা প্রমাণীকরণ যাচাইগুলো উত্তীর্ণ হয়।

If you're calling the generated SDK from a publicly accessible endpoint, it is crucial that the endpoint require authentication and that you validate the integrity of the authentication token before you use it to impersonate a user.

কলযোগ্য Cloud Functions ব্যবহার করার সময়, অথেনটিকেশন টোকেনটি স্বয়ংক্রিয়ভাবে যাচাই করা হয় এবং আপনি এটি নিম্নলিখিত উদাহরণের মতো ব্যবহার করতে পারেন:

import { HttpsError, onCall } from "firebase-functions/https";

export const callableExample = onCall(async (req) => {
    const authClaims = req.auth?.token;
    if (!authClaims) {
        throw new HttpsError("unauthenticated", "Unauthorized");
    }

    const favoriteSongs = await getMyFavoriteSongs(
        undefined,
        { impersonate: { authClaims } }
    );

    // ...
});

অন্যথায়, অথেনটিকেশন টোকেনটি যাচাই এবং ডিকোড করতে Admin SDK এর verifyIdToken মেথডটি ব্যবহার করুন। উদাহরণস্বরূপ, ধরুন আপনার এন্ডপয়েন্টটি একটি সাধারণ HTTP ফাংশন হিসাবে প্রয়োগ করা হয়েছে এবং আপনি প্রচলিত নিয়ম অনুযায়ী authorization হেডার ব্যবহার করে আপনার এন্ডপয়েন্টে Firebase Authentication টোকেনটি পাস করেছেন:

import { getAuth } from "firebase-admin/auth";
import { onRequest } from "firebase-functions/https";

const auth = getAuth();

export const httpExample = onRequest(async (req, res) => {
    const token = req.header("authorization")?.replace(/^bearer\s+/i, "");
    if (!token) {
        res.sendStatus(401);
        return;
    }
    let authClaims;
    try {
        authClaims = await auth.verifyIdToken(token);
    } catch {
        res.sendStatus(401);
        return;
    }

    const favoriteSongs = await getMyFavoriteSongs(
        undefined,
        { impersonate: { authClaims } }
    );

    // ...
});

Only when performing true administrative tasks, such as data migration, from a secure, non-publicly-accessible environment, should you specify a user ID that did not originate from a verifiable source:

// Never do this if end users can initiate execution of the code!
const favoriteSongs = await getMyFavoriteSongs(
  undefined,
  { impersonate: { authClaims } }
);

অবাধ অ্যাক্সেস সহ চলছে

আপনি যদি এমন কোনো অপারেশন সম্পাদন করেন যার জন্য অ্যাডমিন স্তরের অনুমতির প্রয়োজন, তাহলে কলটি থেকে impersonate প্যারামিটারটি বাদ দিন:

await upsertSong(adminDc, {
  title: songTitle_one,
  instrumentsUsed: [Instrument.VOCAL],
});

An operation called in this manner has complete access to the database. If you have queries or mutations intended only to be used for administration purposes, you should define them with the @auth(level: NO_ACCESS) directive. Doing so ensures that only admin-level callers can execute these operations.

executeGraphql মেথড ব্যবহার করে ডেটা পরিচালনা করুন

যদি আপনাকে এমন কোনো এককালীন অপারেশন সম্পাদন করতে হয় যার জন্য আপনি gql মিউটেশন বা কোয়েরি সংজ্ঞায়িত করেননি, তাহলে আপনি executeGraphql মেথড অথবা রিড-অনলি executeGraphqlRead মেথড ব্যবহার করতে পারেন।

অপ্রমাণিত ব্যবহারকারীর ছদ্মবেশ ধারণ করা

অ্যাডমিন SDK ব্যবহার করে পাবলিক অপারেশন চালানোর সময়, আপনার সম্পূর্ণ অ্যাডমিনিস্ট্রেটর প্রিভিলেজ দিয়ে অপারেশনটি চালানো এড়িয়ে চলা উচিত (লিস্ট প্রিভিলেজের নীতি অনুসরণ করে)। এর পরিবর্তে, আপনার অপারেশনটি হয় একজন ইমপারসোনেটেড ইউজার হিসেবে ( পরবর্তী বিভাগ দেখুন), অথবা একজন ইমপারসোনেটেড আনঅথেনটিকেটেড ইউজার হিসেবে চালানো উচিত। আনঅথেনটিকেটেড ইউজাররা শুধুমাত্র PUBLIC হিসেবে চিহ্নিত অপারেশনগুলোই চালাতে পারে।

// 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);

একজন ব্যবহারকারীর ছদ্মবেশ ধারণ করা

এমন কিছু ব্যবহারের ক্ষেত্রও রয়েছে যেখানে আপনি চান আপনার স্ক্রিপ্টগুলো কোনো নির্দিষ্ট ব্যবহারকারীর পক্ষ থেকে, সীমিত পরিচয়পত্রের ভিত্তিতে ব্যবহারকারীর ডেটা পরিবর্তন করুক। এই পদ্ধতিটি ন্যূনতম বিশেষাধিকারের নীতিকে সম্মান করে।

এই ইন্টারফেসটি ব্যবহার করতে, 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" } } }

প্রশাসনিক পরিচয়পত্র ব্যবহার করুন

আপনি যদি এমন কোনো অপারেশন সম্পাদন করেন যার জন্য অ্যাডমিন স্তরের অনুমতির প্রয়োজন, তাহলে কলটি থেকে impersonate প্যারামিটারটি বাদ দিন:

// 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" } } }

এইভাবে কল করা একটি অপারেশনের ডাটাবেসে সম্পূর্ণ অ্যাক্সেস থাকে। আপনার যদি এমন কোয়েরি বা মিউটেশন থাকে যা শুধুমাত্র প্রশাসনিক উদ্দেশ্যে ব্যবহার করার জন্য তৈরি, তবে আপনার সেগুলিকে @auth(level: NO_ACCESS) নির্দেশিকা দিয়ে সংজ্ঞায়িত করা উচিত। এটি নিশ্চিত করে যে শুধুমাত্র অ্যাডমিন-স্তরের কলাররাই এই অপারেশনগুলি সম্পাদন করতে পারবে।

বাল্ক ডেটা অপারেশন সম্পাদন করুন

প্রোডাকশন ডেটাবেসে বাল্ক ডেটা অপারেশনের জন্য ফায়ারবেস Admin SDK ব্যবহার করার পরামর্শ দেয়।

এসডিকে-টি বাল্ক ডেটা নিয়ে কাজ করার জন্য নিম্নলিখিত মেথডগুলো প্রদান করে। প্রদত্ত আর্গুমেন্টগুলো থেকে, প্রতিটি মেথড একটি GraphQL মিউটেশন তৈরি ও কার্যকর করে।


// Methods of the bulk operations API
// dc is a Data Connect admin instance from getDataConnect

const resp = await dc.insert("movie" /*table name*/, data[0]);
const resp = await dc.insertMany("movie" /*table name*/, data);
const resp = await dc.upsert("movie" /*table name*/, data[0]);
const resp = await dc.upsertMany("movie" /*table name*/, data);

বাল্ক অপারেশনের জন্য পারফরম্যান্স নোট

ব্যাকএন্ডে প্রতিটি অনুরোধের জন্য ক্লাউড এসকিউএল-এ একবার যাতায়াত করতে হয়, তাই আপনি যত বেশি ব্যাচ করবেন, থ্রুপুট তত বেশি হবে।

তবে, ব্যাচ সাইজ যত বড় হবে, তৈরি হওয়া SQL স্টেটমেন্টও তত দীর্ঘ হবে। যখন PostgreSQL-এর SQL স্টেটমেন্টের দৈর্ঘ্যের সীমায় পৌঁছানো যাবে, তখন আপনি একটি ত্রুটির সম্মুখীন হবেন।

বাস্তবে, আপনার কাজের চাপের জন্য উপযুক্ত ব্যাচ সাইজ খুঁজে বের করতে পরীক্ষা-নিরীক্ষা করুন।

এরপর কী?