공개 애플리케이션을 빌드할 때는 시스템에 저장된 데이터를 저장하는 데 사용됩니다 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 인증 플러그인을 사용하면 user
이
DecodedIdToken
언급한 대로 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에서 자체적인 승인 확인을 설정하는 것이 좋습니다. 사용할 수 있습니다 다음과 같은 옵션을 선택할 수 있습니다.
원하는 서버 프레임워크를 사용하고 다음을 통해 인증 컨텍스트를 전달
runFlow()
를 사용합니다.내장된
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()
에서 무시됩니다.