Firebase Admin SDK হল সার্ভার লাইব্রেরির একটি সেট যা আপনাকে বিশেষ সুবিধাপ্রাপ্ত পরিবেশ থেকে ফায়ারবেসের সাথে ইন্টারঅ্যাক্ট করতে দেয় যাতে বাল্ক ডেটা ম্যানেজমেন্টের জন্য Firebase Data Connect পরিষেবাতে কোয়েরি এবং মিউটেশন সম্পাদন করা যায় এবং উন্নত সুবিধা এবং ছদ্মবেশী শংসাপত্র সহ অন্যান্য ক্রিয়াকলাপ করা যায়।
Admin SDK আপনাকে পঠন/লেখা এবং পঠন-শুধুমাত্র উভয় মোডে অপারেশন কল করার জন্য একটি API প্রদান করে। পঠন-শুধুমাত্র অপারেশনের মাধ্যমে, আপনি এমন প্রশাসনিক ফাংশন বাস্তবায়নের মানসিক শান্তি পাবেন যা আপনার ডাটাবেসে ডেটা পরিবর্তন করতে পারে না।
অ্যাডমিন SDK সেটআপ
আপনার সার্ভারে With Firebase Data Connect ব্যবহার শুরু করতে, আপনাকে প্রথমে Node.js এর জন্য Admin SDK ইনস্টল এবং সেট আপ করতে হবে।
আপনার স্ক্রিপ্টগুলিতে অ্যাডমিন 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 সাথে ব্যবহারের জন্য ডিজাইন কোয়েরি এবং মিউটেশন
নিম্নলিখিত বিবেচ্য বিষয়গুলি বিবেচনা করে, 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 অ্যাডমিন SDK গুলি স্বয়ংক্রিয়ভাবে Data Connect এমুলেটরের সাথে সংযুক্ত হয়:
export DATA_CONNECT_EMULATOR_HOST="127.0.0.1:9399"
আরও তথ্যের জন্য, দেখুন:
অ্যাডমিন অপারেশন চালান
আপনার গুরুত্বপূর্ণ ডেটার উপর বিশেষাধিকারপ্রাপ্ত ক্রিয়াকলাপের জন্য Admin SDK প্রদান করা হয়।
অ্যাডমিন SDK তিনটি সেট API প্রদান করে:
- জেনারেটেড অ্যাডমিন SDK, যা আপনার
gqlসংজ্ঞা থেকে তৈরি টাইপ-সেফ SDK, ঠিক যেমন আপনি ক্লায়েন্ট SDK তৈরি করেন। - নির্বিচারে GraphQL অপারেশন চালানোর জন্য একটি সাধারণ ইন্টারফেস, যেখানে আপনার কোড কোয়েরি এবং মিউটেশন বাস্তবায়ন করে এবং সেগুলিকে read-write
executeGraphqlপদ্ধতি বা read-onlyexecuteGraphqlReadপদ্ধতিতে প্রেরণ করে। - বাল্ক ডেটা অপারেশনের জন্য একটি বিশেষ ইন্টারফেস, যা জেনেরিক
executeGraphqlপদ্ধতির পরিবর্তে, মিউটেশন অপারেশনের জন্য নিবেদিতপ্রাণ পদ্ধতিগুলি প্রকাশ করে:insert,insertMany,upsert, এবংupsertMany।
জেনারেটেড SDK দিয়ে ডেটা পরিচালনা করুন
আপনি আপনার gql সংজ্ঞা থেকে অ্যাডমিন SDK তৈরি করেন ঠিক একইভাবে যেভাবে আপনি ক্লায়েন্ট SDK তৈরি করেন।
জেনারেটেড অ্যাডমিন SDK-তে আপনার gql সংজ্ঞার সাথে সঙ্গতিপূর্ণ ইন্টারফেস এবং ফাংশন রয়েছে, যা আপনি আপনার ডাটাবেসে ক্রিয়াকলাপ সম্পাদন করতে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, ধরুন আপনি গানের একটি ডাটাবেসের জন্য একটি SDK তৈরি করেছেন, একটি কোয়েরি সহ, 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 } }
);
একজন অননুমোদিত ব্যবহারকারীর ছদ্মবেশ ধারণ করা
অ্যাডমিন SDK গুলি বিশ্বস্ত পরিবেশ থেকে চালানোর উদ্দেশ্যে তৈরি করা হয়, এবং তাই আপনার ডাটাবেসে সীমাহীন অ্যাক্সেস থাকে।
যখন আপনি অ্যাডমিন SDK দিয়ে পাবলিক অপারেশন চালান, তখন আপনার সম্পূর্ণ অ্যাডমিনিস্ট্রেটর সুবিধা সহ অপারেশন চালানো এড়িয়ে চলা উচিত (সর্বনিম্ন সুবিধার নীতি অনুসরণ করে)। পরিবর্তে, আপনার অপারেশনটি হয় একজন ছদ্মবেশী ব্যবহারকারী (পরবর্তী বিভাগটি দেখুন), অথবা একজন ছদ্মবেশী অপ্রমাণিত ব্যবহারকারী হিসেবে চালানো উচিত। অপ্রমাণিত ব্যবহারকারীরা শুধুমাত্র PUBLIC হিসাবে চিহ্নিত অপারেশনগুলি চালাতে পারবেন।
উপরের উদাহরণে, getSongs কোয়েরিটি একটি অননুমোদিত ব্যবহারকারী হিসাবে কার্যকর করা হয়েছে।
একজন ব্যবহারকারীর ছদ্মবেশ ধারণ করা
আপনি impersonate বিকল্পে একটি Firebase Authentication টোকেনের আংশিক বা সম্পূর্ণ অংশ পাস করে নির্দিষ্ট ব্যবহারকারীদের পক্ষে ক্রিয়াকলাপ সম্পাদন করতে পারেন; কমপক্ষে, আপনাকে সাব-ক্লেইমে ব্যবহারকারীর ব্যবহারকারী আইডি নির্দিষ্ট করতে হবে। (এটি auth.uid সার্ভার মানের মতোই যা আপনি Data Connect GraphQL অপারেশনে উল্লেখ করতে পারেন।)
যখন আপনি একজন ব্যবহারকারীর ছদ্মবেশ ধারণ করেন, তখনই অপারেশনটি সফল হবে যদি আপনার প্রদত্ত ব্যবহারকারীর ডেটা আপনার GraphQL সংজ্ঞায় উল্লেখিত প্রমাণীকরণ পরীক্ষাগুলি পাস করে।
যদি আপনি একটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য এন্ডপয়েন্ট থেকে জেনারেট করা SDK কল করেন, তাহলে এটি অত্যন্ত গুরুত্বপূর্ণ যে এন্ডপয়েন্টটির প্রমাণীকরণ প্রয়োজন এবং ব্যবহারকারীর ছদ্মবেশে এটি ব্যবহার করার আগে প্রমাণীকরণ টোকেনের অখণ্ডতা যাচাই করুন।
কলযোগ্য 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 ফাংশন হিসাবে প্রয়োগ করা হয়েছে এবং আপনি Firebase Authentication টোকেনটি authorization হেডার ব্যবহার করে আপনার এন্ডপয়েন্টে পাস করেছেন, যেমনটি স্ট্যান্ডার্ড:
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 } }
);
// ...
});
শুধুমাত্র যখন কোনও নিরাপদ, অ-প্রকাশ্য-অ্যাক্সেসযোগ্য পরিবেশ থেকে ডেটা মাইগ্রেশনের মতো প্রকৃত প্রশাসনিক কাজ সম্পাদন করা হয়, তখন আপনার এমন একটি ব্যবহারকারী আইডি উল্লেখ করা উচিত যা কোনও যাচাইযোগ্য উৎস থেকে উদ্ভূত হয়নি:
// Never do this if end users can initiate execution of the code!
const favoriteSongs = await getMyFavoriteSongs(
undefined,
{ impersonate: { authClaims } }
);
অবাধ প্রবেশাধিকার সহ চলমান
যদি আপনি এমন কোনও অপারেশন করেন যার জন্য অ্যাডমিন স্তরের অনুমতি প্রয়োজন হয়, তাহলে কল থেকে ছদ্মবেশ পরামিতিটি বাদ দিন:
await upsertSong(adminDc, {
title: songTitle_one,
instrumentsUsed: [Instrument.VOCAL],
});
এই পদ্ধতিতে ডাকা একটি অপারেশনের ডাটাবেসে সম্পূর্ণ অ্যাক্সেস থাকে। যদি আপনার কোন প্রশ্ন বা মিউটেশন থাকে যা শুধুমাত্র প্রশাসনিক উদ্দেশ্যে ব্যবহারের জন্য তৈরি, তাহলে আপনার @auth(level: NO_ACCESS) নির্দেশিকা ব্যবহার করে সেগুলি সংজ্ঞায়িত করা উচিত। এটি নিশ্চিত করে যে শুধুমাত্র অ্যাডমিন-স্তরের কলাররাই এই অপারেশনগুলি সম্পাদন করতে পারবেন।
executeGraphql পদ্ধতি ব্যবহার করে ডেটা পরিচালনা করুন
যদি আপনার এমন এককালীন অপারেশন চালানোর প্রয়োজন হয় যার জন্য আপনি gql মিউটেশন বা কোয়েরি সংজ্ঞায়িত করেননি, তাহলে আপনি executeGraphql পদ্ধতি অথবা read-only 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);
একজন ব্যবহারকারীর ছদ্মবেশ ধারণ করা
এমন কিছু ব্যবহারের ক্ষেত্রেও আছে যেখানে আপনি চান যে আপনার স্ক্রিপ্টগুলি নির্দিষ্ট ব্যবহারকারীর পক্ষে সীমিত শংসাপত্রের ভিত্তিতে ব্যবহারকারীর ডেটা পরিবর্তন করুক। এই পদ্ধতিটি সর্বনিম্ন সুবিধার নীতিকে সম্মান করে।
এই ইন্টারফেসটি ব্যবহার করার জন্য, একটি কাস্টমাইজড JWT প্রমাণীকরণ টোকেন থেকে তথ্য সংগ্রহ করুন যা Authentication টোকেন ফর্ম্যাট অনুসরণ করে। এছাড়াও কাস্টম টোকেন গাইড দেখুন।
// 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" } } }
প্রশাসনিক শংসাপত্র ব্যবহার করুন
যদি আপনি এমন কোনও অপারেশন করেন যার জন্য অ্যাডমিন স্তরের অনুমতি প্রয়োজন হয়, তাহলে কল থেকে ছদ্মবেশ পরামিতিটি বাদ দিন:
// 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 ব্যবহার করার পরামর্শ দেয়।
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-এ একবার করে যেতে হবে, তাই আপনি যত বেশি ব্যাচ করবেন, থ্রুপুট তত বেশি হবে।
তবে, ব্যাচের আকার যত বড় হবে, জেনারেট করা SQL স্টেটমেন্ট তত লম্বা হবে। PostgreSQL SQL স্টেটমেন্টের দৈর্ঘ্যের সীমায় পৌঁছে গেলে, আপনি একটি ত্রুটির সম্মুখীন হবেন।
বাস্তবে, আপনার কাজের চাপের জন্য উপযুক্ত ব্যাচের আকার খুঁজে বের করার জন্য পরীক্ষা করুন।
এরপর কী?
- Admin SDK ব্যবহার করে আপনার ডাটাবেসে ডেটা সিডিং সম্পর্কে জানুন
- Admin SDK এর API পর্যালোচনা করুন।
- অন্যান্য প্রকল্প পরিচালনার জন্য, যেমন স্কিমা এবং সংযোগকারী পরিচালনা এবং পরিষেবা এবং ডাটাবেস পরিচালনার জন্য Firebase CLI এবং Google Cloud কনসোল ব্যবহার করুন।