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

Firebase Data Connect অ্যাডমিন SDK গুলি আপনাকে ক্লাউড ফাংশন, কাস্টম ব্যাকএন্ড, অথবা আপনার নিজস্ব ওয়ার্কস্টেশনের মতো বিশ্বস্ত পরিবেশ থেকে আপনার প্রশ্ন এবং মিউটেশন কল করতে দেয়। আপনার ক্লায়েন্ট অ্যাপের জন্য SDK তৈরি করার মতোই, আপনি আপনার ডেটা কানেক্ট পরিষেবাতে স্থাপন করা স্কিমা, প্রশ্ন এবং মিউটেশন ডিজাইন করার সময় সমান্তরালভাবে একটি কাস্টম অ্যাডমিন SDK তৈরি করতে পারেন। তারপর, আপনি এই SDK থেকে পদ্ধতিগুলিকে আপনার ব্যাকএন্ড লজিক বা প্রশাসনিক স্ক্রিপ্টে একীভূত করেন।

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

শুরু করার আগে

অ্যাডমিন SDK তৈরি করুন

আপনার ডেটা কানেক্ট স্কিমা, কোয়েরি এবং মিউটেশন তৈরি করার পরে, আপনি একটি সংশ্লিষ্ট অ্যাডমিন SDK তৈরি করতে পারেন:

  1. একটি connector.yaml ফাইল খুলুন বা তৈরি করুন এবং একটি adminNodeSdk সংজ্ঞা যোগ করুন:

    connectorId: default
    generate:
      adminNodeSdk:
        outputDir: ../../dataconnect-generated/admin-generated
        package: "@dataconnect/admin-generated"
        packageJsonDir: ../..
    

    connector.yaml ফাইলটি সাধারণত GraphQL (.gql) ফাইলের মতো একই ডিরেক্টরিতে পাওয়া যায় যেখানে আপনার কোয়েরি এবং মিউটেশন সংজ্ঞা থাকে। যদি আপনি ইতিমধ্যেই ক্লায়েন্ট SDK তৈরি করে থাকেন, তাহলে এই ফাইলটি ইতিমধ্যেই তৈরি করা হয়েছে।

  2. SDK তৈরি করুন।

    যদি আপনার ডেটা কানেক্ট ভিএস কোড এক্সটেনশন ইনস্টল করা থাকে, তাহলে এটি সর্বদা জেনারেট করা SDK গুলিকে আপ টু ডেট রাখবে।

    অন্যথায়, Firebase CLI ব্যবহার করুন:

    firebase dataconnect:sdk:generate

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

    firebase dataconnect:sdk:generate --watch

একটি অ্যাডমিন 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) নির্দেশিকা ব্যবহার করে সেগুলি সংজ্ঞায়িত করা উচিত। এটি নিশ্চিত করে যে শুধুমাত্র অ্যাডমিন-স্তরের কলাররাই এই অপারেশনগুলি সম্পাদন করতে পারবেন।