Przy tworzeniu aplikacji dostępnych publicznie należy koniecznie danych przechowywanych w systemie. W przypadku LLM należy zachować szczególną ostrożność, niezbędne do zagwarantowania, że model uzyskuje dostęp tylko do danych, do których powinien. Wywołania narzędzi mają prawidłowy zakres dla użytkownika wywołującego LLM, a przepływ jest wywoływany wyłącznie przez zweryfikowane aplikacje klienckie.
Firebase Genkit udostępnia mechanizmy do zarządzania zasadami autoryzacji i kontekstach. W przypadku przepływów działających w Cloud Functions dla Firebase programiści muszą musi przedstawić zasady uwierzytelniania lub jednoznacznie potwierdzić brak jeden. W przypadku przepływów niezwiązanych z funkcjami uwierzytelnianiem można też ustawiać i zarządzać, ale wymaga ono ale w przypadku bardziej ręcznej integracji.
Podstawowa autoryzacja przepływu
Wszystkie przepływy mogą definiować authPolicy
w swojej konfiguracji. Zasada uwierzytelniania to funkcja, która sprawdza, czy określone kryteria (zdefiniowane przez Ciebie) są spełnione, i w przypadku niepowodzenia testu zgłasza wyjątek.
Jeśli to pole jest ustawione, jest wykonywane przed wywołaniem przepływu:
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) => { ... });
Podczas wykonywania tego procesu musisz podać obiekt uwierzytelniania za pomocą withLocalAuthContext
. W przeciwnym razie
zostanie wyświetlony błąd:
// 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' },
}
);
W przypadku uruchomienia z interfejsem programistycznym Genkit możesz przekazać obiekt Auth przez
wpisz kod JSON w polu „Auth JSON” karta: {"uid": "abc-def"}
.
Kontekst uwierzytelniania możesz też pobrać w dowolnym momencie procesu.
przez wywołanie metody getFlowAuth()
, również w funkcjach wywoływanych przez przepływ:
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);
});
Podczas testowania przepływów za pomocą narzędzi dla programistów Genkit możesz określić to uwierzytelnianie
w interfejsie użytkownika lub w wierszu poleceń z flagą --auth
:
genkit flow:run selfSummaryFlow '{"uid": "abc-def"}' --auth '{"uid": "abc-def"}'
Integracja Cloud Functions dla Firebase
Wtyczka Firebase zapewnia wygodną integrację z Uwierzytelnianiem Firebase / Google z Cloud Identity Platform oraz wbudowaną obsługą Sprawdzania aplikacji Firebase.
Autoryzacja
Opakowanie onFlow()
dostarczane przez wtyczkę Firebase działa natywnie z tagiem
Cloud Functions dla Firebase
pakietów SDK klientów.
W przypadku korzystania z pakietu SDK nagłówek Uwierzytelniania Firebase będzie automatycznie uwzględniany jako
o ile klient aplikacji również używa
Pakiet SDK Firebase Auth.
Uwierzytelniania Firebase możesz używać do ochrony przepływów zdefiniowanych w 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) => {...})
Podczas korzystania z wtyczki Uwierzytelnianie Firebase interfejs user
będzie zwracany jako
DecodedIdToken.
W każdej chwili możesz pobrać ten obiekt przy użyciu getFlowAuth()
, jak zaznaczono
powyżej. Uruchamiając ten proces w trakcie programowania, przekażesz obiekt użytkownika
w ten sam sposób:
genkit flow:run selfSummaryFlow '{"uid": "abc-def"}' --auth '{"admin": true}'
Domyślnie wtyczka Firebase Auth wymaga, aby nagłówek uwierzytelniania był wysyłany przez klienta, ale w przypadkach, gdy chcesz zezwolić na nieuwierzytelniony dostęp, używając specjalnych obsługi uwierzytelnionych użytkowników (np. w celu zwiększenia sprzedaży), możesz skonfiguruj zasadę w następujący sposób:
authPolicy: firebaseAuth((user) => {
if (user && !user.email_verified) {
throw new Error("Logged in users must have verified emails");
}
}, {required: false}),
Gdy udostępniasz funkcję w Cloud Functions w szerszym internecie,
ważne jest użycie jakiegoś rodzaju mechanizmu autoryzacji do ochrony danych
i danych klientów. Mimo to zdarzają się sytuacje, w których
aby wdrożyć funkcję w Cloud Functions bez testów autoryzacji opartych na kodzie (na przykład
funkcja nie jest wywoływana przez świat, ale jest chroniona przez
Cloud IAM).
Gdy używasz onFlow()
, pole authPolicy
jest zawsze wymagane, ale możesz
poinformować bibliotekę, że przechodzisz testy autoryzacji, korzystając z
Funkcja 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) => {...})
Uczciwość klienta
Samo uwierzytelnianie pomaga w ochronie aplikacji. Jest to też
musisz mieć pewność, że tylko aplikacje klienckie wywołują Twoje funkcje.
Wtyczka Firebase do genkit zapewnia najwyższej klasy obsługę
Sprawdzanie aplikacji Firebase. Po prostu dodaj
te opcje konfiguracji w: 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) => {...})
Autoryzacja HTTP spoza Firebase
Podczas wdrażania przepływów w kontekście serwera poza Cloud Functions w Firebase, musisz mieć możliwość skonfigurowania własnych mechanizmów sprawdzania autoryzacji w porównaniu z procesami natywnymi. Dostępne są dwie opcje:
Możesz używać dowolnej platformy serwera i przekazać kontekst uwierzytelniania za pomocą
runFlow()
, jak zaznaczono powyżej.Użyj wbudowanego narzędzia
startFlowsServer()
i udostępnij ekspresowe oprogramowanie pośredniczące w konfiguracja przepływu: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
Więcej informacji o korzystaniu z usługi Express znajdziesz w artykule Cloud Run. za instrukcje.
Pamiętaj, że jeśli wybierzesz (1), opcja konfiguracji middleware
będzie
mogą zostać zignorowane przez: runFlow()
.