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

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

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

মৌলিক প্রবাহ অনুমোদন

সমস্ত প্রবাহ তাদের কনফিগারেশনে একটি authPolicy সংজ্ঞায়িত করতে পারে। একটি প্রমাণীকরণ নীতি হল এমন একটি ফাংশন যা পরীক্ষা করে যদি নির্দিষ্ট মানদণ্ড (আপনার দ্বারা সংজ্ঞায়িত) পূরণ করা হয় এবং কোনো পরীক্ষা ব্যর্থ হলে একটি ব্যতিক্রম ছুড়ে দেয়। যদি এই ক্ষেত্রটি সেট করা থাকে, তাহলে ফ্লো শুরু করার আগে এটি কার্যকর করা হয়:

import { defineFlow, runFlow } from '@genkit-ai/flow';

export const selfSummaryFlow = defineFlow(
  {
    name: 'selfSummaryFlow',
    inputSchema: z.object({uid: z.string()}),
    outputSchema: z.string(),
    authPolicy: (auth, input) => {
      if (!auth) {
        throw new Error('Authorization required.');
      }
      if (input.uid !== auth.uid) {
        throw new Error('You may only summarize your own profile data.');
      }
    }
  },
  async (input) => { ... });

এই প্রবাহটি কার্যকর করার সময়, আপনাকে অবশ্যই একটি প্রমাণীকরণ বস্তু প্রদান করতে হবে withLocalAuthContext ব্যবহার করে অন্যথায় আপনি একটি ত্রুটি পাবেন:

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

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

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

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

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

import { getFlowAuth, defineFlow } from '@genkit-ai/flow';

async function readDatabase(uid: string) {
  if (getFlowAuth().admin) {
    // Do something special if the user is an admin:
    ...
  } else {
    // Otherwise, use the `uid` variable to retrieve the relevant document
    ...
  }
}

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

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

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

ফায়ারবেস ইন্টিগ্রেশনের জন্য ক্লাউড ফাংশন

Firebase প্লাগইন Firebase Auth/Google ক্লাউড আইডেন্টিটি প্ল্যাটফর্মের সাথে বিল্ট-ইন Firebase অ্যাপ চেক সমর্থনের সাথে সুবিধাজনক একীকরণ প্রদান করে।

অনুমোদন

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

import {firebaseAuth} from "@genkit-ai/firebase/auth";
import {onFlow} from "@genkit-ai/firebase/functions";

export const selfSummaryFlow = onFlow({
    name: "selfSummaryFlow",
    inputSchema: z.string(),
    outputSchema: z.string(),
    authPolicy: firebaseAuth((user) => {
      if (!user.email_verified && !user.admin) {
        throw new Error("Email not verified");
      }
    }),
  }, (subject) => {...})

Firebase Auth প্লাগইন ব্যবহার করার সময়, user একটি DecodedIdToken হিসাবে ফেরত দেওয়া হবে। আপনি উপরে উল্লিখিত হিসাবে getFlowAuth() এর মাধ্যমে যে কোনও সময় এই বস্তুটি পুনরুদ্ধার করতে পারেন। বিকাশের সময় এই প্রবাহটি চালানোর সময়, আপনি ব্যবহারকারীর অবজেক্টটিকে একইভাবে পাস করবেন:

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

ডিফল্টরূপে Firebase প্রমাণীকরণ প্লাগইনটির জন্য ক্লায়েন্টের দ্বারা প্রমাণীকরণ শিরোনাম পাঠানোর প্রয়োজন হয়, কিন্তু যে ক্ষেত্রে আপনি প্রমাণীকৃত ব্যবহারকারীদের (আপসেলিং বৈশিষ্ট্য, বলুন) জন্য বিশেষ হ্যান্ডলিং সহ অননুমোদিত অ্যাক্সেসের অনুমতি দিতে চান, তাহলে আপনি নীতিটি এভাবে কনফিগার করতে পারেন:

authPolicy: firebaseAuth((user) => {
  if (user && !user.email_verified) {
    throw new Error("Logged in users must have verified emails");
  }
}, {required: false}),

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

import {onFlow, noAuth} from "@genkit-ai/firebase/functions";

export const selfSummaryFlow = onFlow({
    name: "selfSummaryFlow",
    inputSchema: z.string(),
    outputSchema: z.string(),
    // WARNING: Only do this if you have some other gatekeeping in place, like
    // Cloud IAM!
    authPolicy: noAuth(),
  }, (subject) => {...})

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

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

import {onFlow} from "@genkit-ai/firebase/functions";

export const selfSummaryFlow = onFlow({
    name: "selfSummaryFlow",
    inputSchema: z.string(),
    outputSchema: z.string(),

    // 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: ...,
  }, (subject) => {...})

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

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

  1. আপনার পছন্দের সার্ভার ফ্রেমওয়ার্ক ব্যবহার করুন এবং উপরে উল্লিখিত হিসাবে runFlow() এর মাধ্যমে প্রমাণীকরণের প্রসঙ্গ পাস করুন।

  2. বিল্ট-ইন startFlowsServer() ব্যবহার করুন এবং ফ্লো কনফিগারেশনে এক্সপ্রেস মিডলওয়্যার প্রদান করুন:

    export const selfSummaryFlow = defineFlow(
    {
      name: 'selfSummaryFlow',
      inputSchema: z.object({uid: z.string()}),
      outputSchema: z.string(),
      middleware: [
        (req, res, next) => {
          const token = req.headers['authorization'];
          const user = yourVerificationLibrary(token);
    
          // This is what will get passed to your authPolicy
          req.auth = user;
          next();
        }
      ],
      authPolicy: (auth, input) => {
        if (!auth) {
          throw new Error('Authorization required.');
        }
        if (input.uid !== auth.uid) {
          throw new Error('You may only summarize your own profile data.');
        }
      }
    },
    async (input) => { ... });
    
    startFlowsServer();  // This will register the middleware
    

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

অনুগ্রহ করে মনে রাখবেন, আপনি যদি (1) এর সাথে যান, তাহলে আপনার middleware কনফিগারেশন বিকল্পটি runFlow() দ্বারা উপেক্ষা করা হবে।