অনুমোদন এবং সততা

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

Firebase Genkit অনুমোদন নীতি এবং প্রসঙ্গগুলি পরিচালনা করার জন্য প্রক্রিয়া প্রদান করে। Firebase এ চলমান ফ্লো একটি প্রমাণীকরণ নীতি কলব্যাক (বা সাহায্যকারী) ব্যবহার করতে পারে। বিকল্পভাবে, Firebase ফ্লোতে প্রমাণীকরণের প্রসঙ্গও প্রদান করে যেখানে এটি নিজের চেক করতে পারে। অ-ফাংশন প্রবাহের জন্য, auth পরিচালনা করা যেতে পারে এবং মিডলওয়্যারের মাধ্যমে সেট করা যেতে পারে।

একটি প্রবাহ মধ্যে অনুমোদন

প্রবাহ দুটি উপায়ে অনুমোদন পরীক্ষা করতে পারে: হয় অনুরোধ বাইন্ডিং (যেমন ফায়ারবেস বা express জন্য ক্লাউড ফাংশনগুলির জন্য onCallGenkit ) অনুমোদন কার্যকর করতে পারে, অথবা সেই কাঠামোগুলি ফ্লোতেই প্রমাণীকরণ নীতিগুলি পাস করতে পারে, যেখানে প্রবাহের মধ্যে প্রবাহের মধ্যে পরিচালিত প্রমাণীকরণের তথ্যের অ্যাক্সেস রয়েছে৷

import { genkit, z, UserFacingError } from 'genkit';

const ai = genkit({ ... });

export const selfSummaryFlow = ai.defineFlow( {
  name: 'selfSummaryFlow',
  inputSchema: z.object({ uid: z.string() }),
  outputSchema: z.string(),
}, async (input, { context }) => {
  if (!context.auth) {
    throw new UserFacingErrorError('UNAUTHENTICATED', 'Unauthenticated');
  }
  if (input.uid !== context.auth.uid) {
    throw new UserFacingError('PERMISSION_DENIED', 'You may only summarize your own profile data.');
  }
  // Flow logic here...
});

এই ক্ষেত্রে context.auth পপুলেট করার অনুরোধের উপর নির্ভর করে। উদাহরণস্বরূপ, onCallGenkit স্বয়ংক্রিয়ভাবে context.auth (Firebase প্রমাণীকরণ), context.app (Firebase অ্যাপ চেক), এবং context.instanceIdToken (Firebase ক্লাউড মেসেজিং) পূরণ করে। ম্যানুয়ালি একটি ফ্লো কল করার সময়, আপনি ম্যানুয়ালি আপনার নিজস্ব প্রমাণীকরণ প্রসঙ্গ যোগ করতে পারেন।

// Error: Authorization required.
await selfSummaryFlow({ uid: 'abc-def' });

// Error: You may only summarize your own profile data.
await selfSummaryFlow.run(
  { uid: 'abc-def' },
  {
    context: { auth: { uid: 'hij-klm' } },
  }
);

// Success
await selfSummaryFlow(
  { uid: 'abc-def' },
  {
    context: { auth: { uid: 'abc-def' } },
  }
);

Genkit ডেভেলপমেন্ট UI এর সাথে চলার সময়, আপনি "Auth JSON" ট্যাবে JSON লিখে Auth অবজেক্টটি পাস করতে পারেন: {"uid": "abc-def"}

এছাড়াও আপনি প্রবাহের মধ্যে যেকোন সময় ai.currentContext() কল করে প্রবাহের জন্য প্রমাণীকরণ প্রসঙ্গ পুনরুদ্ধার করতে পারেন, প্রবাহের দ্বারা আহ্বান করা ফাংশনগুলি সহ:

import { genkit, z } from 'genkit';

const ai = genkit({ ... });;

async function readDatabase(uid: string) {
  const auth = ai.currentContext()?.auth;
  // Note: the shape of context.auth depends on the provider. onCallGenkit puts
  // claims information in auth.token
  if (auth?.token?.admin) {
    // Do something special if the user is an admin
  } else {
    // Otherwise, use the `uid` variable to retrieve the relevant document
  }
}

export const selfSummaryFlow = ai.defineFlow(
  {
    name: 'selfSummaryFlow',
    inputSchema: z.object({ uid: z.string() }),
    outputSchema: z.string(),
    authPolicy: ...
  },
  async (input) => {
    await readDatabase(input.uid);
  }
);

যখন Genkit dev সরঞ্জামগুলির সাথে পরীক্ষা প্রবাহিত হয়, আপনি এই auth অবজেক্টটিকে UI-তে বা --context পতাকা সহ কমান্ড লাইনে নির্দিষ্ট করতে পারবেন:

genkit flow:run selfSummaryFlow '{"uid": "abc-def"}' --context '{"auth": {"email_verified": true}}'

ফায়ারবেসের জন্য ক্লাউড ফাংশন ব্যবহার করে অনুমোদন করুন

Firebase SDK-এর জন্য ক্লাউড ফাংশন Genkit সমর্থন করে যার মধ্যে Firebase Auth/Google ক্লাউড আইডেন্টিটি প্ল্যাটফর্মের সাথে ইন্টিগ্রেশন, সেইসাথে বিল্ট-ইন Firebase অ্যাপ চেক সমর্থন।

ব্যবহারকারীর প্রমাণীকরণ

Firebase ফাংশন লাইব্রেরি দ্বারা প্রদত্ত onCallGenkit() র্যাপার Firebase ক্লায়েন্ট SDK-এর জন্য ক্লাউড ফাংশনগুলির জন্য অন্তর্নির্মিত সমর্থন রয়েছে৷ আপনি যখন এই SDKগুলি ব্যবহার করেন, তখন Firebase Auth শিরোনামটি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত হয় যতক্ষণ না আপনার অ্যাপ ক্লায়েন্ট Firebase Auth SDK ব্যবহার করছে৷ onCallGenkit() এর সাথে সংজ্ঞায়িত আপনার প্রবাহ রক্ষা করতে আপনি Firebase Auth ব্যবহার করতে পারেন:

import { genkit } from 'genkit';
import { onCallGenkit } from 'firebase-functions/https';

const ai = genkit({ ... });;

const selfSummaryFlow = ai.defineFlow({
  name: 'selfSummaryFlow',
  inputSchema: z.string(),
  outputSchema: z.string(),
}, async (input) => {
  // Flow logic here...
});

export const selfSummary = onCallGenkit({
  authPolicy: (auth) => auth?.token?.['email_verified'] && auth?.token?.['admin'],
}, selfSummaryFlow);

আপনি যখন onCallGenkit ব্যবহার করেন, তখন context.auth ব্যবহারকারী আইডির জন্য একটি uid সহ একটি অবজেক্ট হিসাবে ফেরত দেওয়া হয় এবং একটি token যা একটি DecodedIdToken । আপনি যেকোন সময় ai.currentContext() ব্যবহার করে এই বস্তুটি পুনরুদ্ধার করতে পারেন যেমনটি আগে উল্লেখ করা হয়েছে। বিকাশের সময় এই প্রবাহটি চালানোর সময়, আপনি ব্যবহারকারীর অবজেক্টটিকে একইভাবে পাস করবেন:

genkit flow:run selfSummaryFlow '{"uid": "abc-def"}' --context '{"auth": {"admin": true}}'

যখনই আপনি একটি ক্লাউড ফাংশনকে বিস্তৃত ইন্টারনেটে প্রকাশ করেন, তখন এটি অত্যন্ত গুরুত্বপূর্ণ যে আপনি আপনার ডেটা এবং আপনার গ্রাহকদের ডেটা সুরক্ষিত করতে কিছু ধরণের অনুমোদন প্রক্রিয়া ব্যবহার করুন৷ এটি বলার সাথে সাথে, এমন সময় আছে যখন আপনাকে কোনও কোড-ভিত্তিক অনুমোদন পরীক্ষা ছাড়াই একটি ক্লাউড ফাংশন স্থাপন করতে হবে (উদাহরণস্বরূপ, আপনার ফাংশন বিশ্ব-কলযোগ্য নয় তবে পরিবর্তে ক্লাউড আইএএম দ্বারা সুরক্ষিত)। ফায়ারবেসের জন্য ক্লাউড ফাংশন আপনাকে invoker প্রপার্টি ব্যবহার করে এটি করতে দেয়, যা IAM অ্যাক্সেস নিয়ন্ত্রণ করে। বিশেষ মান 'private' ফাংশনটিকে ডিফল্ট IAM সেটিং হিসাবে ছেড়ে দেয়, যার মানে হল যে শুধুমাত্র ক্লাউড রান ইনভোকার ভূমিকা সহ কলকারীরা ফাংশনটি চালাতে পারে৷ আপনি পরিবর্তে একটি ব্যবহারকারী বা পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা প্রদান করতে পারেন যা এই সঠিক ফাংশনটি কল করার অনুমতি দেওয়া উচিত।

import { onCallGenkit } from 'firebase-functions/https'

const selfSummaryFlow = ai.defineFlow({
  name: 'selfSummaryFlow',
  inputSchema: z.string(),
  outputSchema: z.string(),
}, async (input) => {
  // Flow logic here...
});

export const selfSummary = onCallGenkit({
  invoker: 'private',
}, selfSummaryFlow);

ক্লায়েন্ট সততা

নিজের থেকে প্রমাণীকরণ আপনার অ্যাপকে সুরক্ষিত করতে অনেক দূর এগিয়ে যায়। তবে এটি নিশ্চিত করাও গুরুত্বপূর্ণ যে শুধুমাত্র আপনার ক্লায়েন্ট অ্যাপগুলি আপনার ফাংশনগুলিকে কল করছে৷ genkit-এর জন্য Firebase প্লাগইনে Firebase অ্যাপ চেকের জন্য প্রথম-শ্রেণীর সমর্থন অন্তর্ভুক্ত রয়েছে। আপনার onCallGenkit() এ নিম্নলিখিত কনফিগারেশন বিকল্পগুলি যোগ করে এটি করুন:

import { onCallGenkit } from 'firebase-functions/https';

const selfSummaryFlow = ai.defineFlow({
  name: 'selfSummaryFlow',
  inputSchema: z.string(),
  outputSchema: z.string(),
}, async (input) => {
  // Flow logic here...
});

export const selfSummary = onCallGenkit({
  // These two fields for app check. The consumeAppCheckToken option is for
  // replay protection, and requires additional client configuration. See the
  // App Check docs.
  enforceAppCheck: true,
  consumeAppCheckToken: true,

  authPolicy: ...,
}, selfSummaryFlow);

অ-ফায়ারবেস HTTP অনুমোদন

ফায়ারবেসের জন্য ক্লাউড ফাংশনের বাইরে সার্ভারের প্রেক্ষাপটে প্রবাহ স্থাপন করার সময়, আপনি বিল্ট-ইন ফ্লোগুলির পাশাপাশি আপনার নিজস্ব অনুমোদন চেক সেট আপ করার একটি উপায় চাইবেন৷

auth এর মতো প্রসঙ্গ মানগুলি পূরণ করতে এবং একটি ঘোষণামূলক নীতি বা একটি নীতি কলব্যাক প্রদান করতে একটি ContextProvider ব্যবহার করুন৷ Genkit SDK ContextProvider যেমন apiKey প্রদান করে, এবং প্লাগইনগুলিও সেগুলিকে প্রকাশ করতে পারে। উদাহরণ স্বরূপ, @genkit-ai/firebase/context প্লাগইন Firebase Auth শংসাপত্র যাচাই করার জন্য একটি প্রসঙ্গ সরবরাহকারীকে উন্মোচিত করে এবং সেগুলিকে প্রেক্ষাপটে স্থাপন করে।

নিম্নলিখিতগুলির মতো কোড সহ, যা বিভিন্ন অ্যাপ্লিকেশনগুলিতে প্রদর্শিত হতে পারে:

// Express app with a simple API key
import { genkit, z } from 'genkit';

const ai = genkit({ ... });;

export const selfSummaryFlow = ai.defineFlow(
  {
    name: 'selfSummaryFlow',
    inputSchema: z.object({ uid: z.string() }),
    outputSchema: z.string(),
  },
  async (input) => {
    // Flow logic here...
  }
);

আপনি লিখে একটি সাধারণ "ফ্লো সার্ভার" এক্সপ্রেস অ্যাপ সুরক্ষিত করতে পারেন:

import { apiKey } from "genkit";
import { startFlowServer, withContext } from "@genkit-ai/express";

startFlowServer({
  flows: [
    withContext(selfSummaryFlow, apiKey(process.env.REQUIRED_API_KEY))
  ],
});

অথবা আপনি একই সরঞ্জাম ব্যবহার করে একটি কাস্টম এক্সপ্রেস অ্যাপ্লিকেশন তৈরি করতে পারেন:

import { apiKey } from "genkit";
import * as express from "express";
import { expressHandler } from "@genkit-ai/express;

const app = express();
// Capture but don't validate the API key (or its absence)
app.post('/summary', expressHandler(selfSummaryFlow, { contextProvider: apiKey()}))

app.listen(process.env.PORT, () => {
  console.log(`Listening on port ${process.env.PORT}`);
})

ContextProvider ওয়েব ফ্রেমওয়ার্ককে বিমূর্ত করে, তাই এই টুলগুলি অন্যান্য ফ্রেমওয়ার্ক যেমন Next.js-এও কাজ করে। Next.js-এ নির্মিত একটি Firebase অ্যাপের উদাহরণ এখানে দেওয়া হল।

import { appRoute } from "@genkit-ai/express";
import { firebaseContext } from "@genkit-ai/firebase";

export const POST = appRoute(selfSummaryFlow, { contextProvider: firebaseContext })

এক্সপ্রেস ব্যবহার সম্পর্কে আরও তথ্যের জন্য, ক্লাউড রান নির্দেশাবলী দেখুন।