권한 부여 및 무결성

공개 애플리케이션을 빌드할 때는 시스템에 저장된 데이터를 저장하는 데 사용됩니다 LLM의 경우 추가적인 노력이 필요합니다. 모델이 필요한 데이터에만 액세스하고 있는지 확인하기 위해 LLM을 호출하는 사용자로 범위가 적절하게 지정되고 흐름이 호출되고 있음 인증된 클라이언트 애플리케이션에서만 가능합니다.

Firebase Genkit는 승인 정책 및 있습니다. Firebase용 Cloud Functions에서 실행되는 흐름의 경우 개발자는 또는 명시적으로 승인 정책을 제공해야 하며 그렇지 않은 경우 있습니다 함수 이외의 흐름의 경우 인증을 관리하고 설정할 수도 있지만 더 많은 수동 통합이 필요합니다

기본 흐름 승인

모든 흐름은 구성에서 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 Development UI로 실행할 때 다음의 방법으로 Auth 객체를 전달할 수 있습니다. '인증 JSON'에 JSON을 입력합니다. 탭: {"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 개발자 도구로 흐름을 테스트할 때 이 인증을 지정할 수 있습니다. 객체를 UI에서 또는 명령줄에서 --auth 플래그를 사용하여 객체를 지정합니다.

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

Firebase용 Cloud Functions 통합

Firebase 플러그인은 Firebase 인증 / Google과 편리하게 통합할 수 있습니다. Cloud Identity Platform 및 기본 제공 Firebase 앱 체크 지원

승인

Firebase 플러그인이 제공하는 onFlow() 래퍼는 기본적으로 Firebase용 Cloud Functions 클라이언트 SDK에 연결할 수 있습니다. SDK를 사용하면 Firebase 인증 헤더가 자동으로 앱 클라이언트에서 Firebase Auth SDK Firebase 인증을 사용하여 onFlow()로 정의된 흐름을 보호할 수 있습니다.

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 인증 플러그인을 사용하면 userDecodedIdToken 언급한 대로 getFlowAuth()를 통해 언제든지 이 객체를 가져올 수 있습니다. 참조하세요. 개발 중에 이 흐름을 실행하면 user 객체 같은 방식으로 사용합니다.

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}),

Cloud 함수를 더 광범위한 인터넷에 노출할 때마다 일종의 승인 메커니즘을 사용하여 데이터를 보호하는 것이 중요합니다. 고객의 데이터를 활용할 수 있습니다 그런 의미에서 데이터 애널리스트가 사용할 수 있는 코드 기반 승인 확인 없이 Cloud 함수를 배포합니다 (예: 함수가 전역 호출되지 않지만 대신 Cloud IAM). 이 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) => {...})

Firebase 이외의 HTTP 승인

Cloud Functions 외부의 서버 컨텍스트로 흐름을 배포할 때 Firebase에서 자체적인 승인 확인을 설정하는 것이 좋습니다. 사용할 수 있습니다 다음과 같은 옵션을 선택할 수 있습니다.

  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
    

    Express 사용에 대한 자세한 내용은 Cloud Run을 참조하세요. 참조하세요.

(1)을 사용하면 middleware 구성 옵션이 runFlow()에서 무시됩니다.