Pakiety Admin SDK usługi Firebase SQL Connect umożliwiają wywoływanie zapytań i mutacji z zaufanych środowisk, takich jak Cloud Functions, niestandardowe zaplecza lub własna stacja robocza. Podobnie jak w przypadku generowania pakietów SDK dla aplikacji klienckich, możesz równolegle wygenerować niestandardowy pakiet Admin SDK podczas projektowania schematów, zapytań i mutacji, które wdrażasz w usłudze SQL Connect. Następnie integrujesz metody z tego pakietu SDK z logiką zaplecza lub skryptami administracyjnymi.
Jak wspomnieliśmy w innym miejscu, ważne jest, aby pamiętać, że SQL Connect zapytania i mutacje nie są przesyłane przez klientów w momencie wysyłania żądania. Zamiast tego po wdrożeniu operacje SQL Connect są przechowywane na serwerze, tak jak Cloud Functions. Oznacza to, że za każdym razem, gdy wdrażasz zmiany w zapytaniach i mutacjach, musisz też ponownie wygenerować pakiety Admin SDK i ponownie wdrożyć wszystkie usługi, które z nich korzystają.
Zanim zaczniesz
- Dowiedz się więcej o projektowaniu schematów, zapytań i mutacji SQL Connect. W typowym procesie będziesz je tworzyć równolegle z kodem aplikacji, w tym z usługami, które korzystają z pakietów Admin SDK.
Dodaj pakiet Admin SDK dla Node.js jako zależność wszędzie tam, gdzie planujesz wywoływać wygenerowane pakiety Admin SDK.
Generowanie pakietów Admin SDK
Po utworzeniu schematów, zapytań i mutacji SQL Connect możesz wygenerować odpowiedni pakiet Admin SDK:
Otwórz lub utwórz plik
connector.yamli dodaj definicjęadminNodeSdk:connectorId: default generate: adminNodeSdk: outputDir: ../../dataconnect-generated/admin-generated package: "@dataconnect/admin-generated" packageJsonDir: ../..Plik
connector.yamlzwykle znajduje się w tym samym katalogu co pliki GraphQL (.gql), które zawierają definicje zapytań i mutacji. Jeśli masz już wygenerowane pakiety SDK klienta, ten plik został już utworzony.Wygeneruj pakiet SDK.
Jeśli masz zainstalowane rozszerzenie SQL Connect VS Code, będzie ono zawsze aktualizować wygenerowane pakiety SDK.
W przeciwnym razie użyj wiersza poleceń Firebase:
firebase dataconnect:sdk:generateMożesz też automatycznie ponownie generować pakiety SDK, gdy aktualizujesz pliki
gql:firebase dataconnect:sdk:generate --watch
Wykonywanie operacji z pakietu Admin SDK
Wygenerowany pakiet Admin SDK zawiera interfejsy i funkcje odpowiadające definicjom gql, których możesz używać do wykonywania operacji na bazie danych. Załóżmy na przykład, że wygenerowano pakiet SDK dla bazy danych utworów wraz z zapytaniem getSongs:
import { initializeApp } from "firebase-admin/app";
import { getSongs } from "@dataconnect/admin-generated";
const adminApp = initializeApp();
const songs = await getSongs(
{ limit: 4 },
{ impersonate: { unauthenticated: true } }
);
Możesz też określić konfigurację łącznika:
import { initializeApp } from "firebase-admin/app";
import { getDataConnect } from "firebase-admin/data-connect";
import {
connectorConfig,
getSongs,
} from "@dataconnect/admin-generated";
const adminApp = initializeApp();
const adminDc = getDataConnect(connectorConfig);
const songs = await getSongs(
adminDc,
{ limit: 4 },
{ impersonate: { unauthenticated: true } }
);
Odgrywanie roli nieuwierzytelnionego użytkownika
Pakiety Admin SDK są przeznaczone do uruchamiania w zaufanych środowiskach, dlatego mają nieograniczony dostęp do Twoich baz danych.
Gdy uruchamiasz operacje publiczne za pomocą pakietu Admin SDK, unikaj uruchamiania operacji z pełnymi uprawnieniami administratora (zgodnie z zasadą najmniejszych uprawnień). Zamiast tego uruchom operację jako użytkownik, którego rolę odgrywasz (patrz następna sekcja), lub jako nieuwierzytelniony użytkownik, którego rolę odgrywasz.
Nieuwierzytelnieni użytkownicy mogą uruchamiać tylko operacje oznaczone jako PUBLIC.
W powyższym przykładzie zapytanie getSongs jest wykonywane jako nieuwierzytelniony użytkownik.
Odgrywanie roli innego użytkownika
Możesz też wykonywać operacje w imieniu konkretnych użytkowników, przekazując część lub
całość tokena Firebase Authentication w opcji impersonate. Musisz co
najmniej określić identyfikator użytkownika w roszczeniu sub. (Jest to ta sama wartość co
auth.uid wartość serwera
do której możesz się odwoływać w SQL Connect operacjach GraphQL).
Gdy odgrywasz rolę użytkownika, operacja zakończy się powodzeniem tylko wtedy, gdy podane przez Ciebie dane użytkownika przejdą kontrole uwierzytelniania określone w definicji GraphQL.
Jeśli wywołujesz wygenerowany pakiet SDK z publicznie dostępnego punktu końcowego, ważne jest, aby punkt końcowy wymagał uwierzytelnienia i aby przed użyciem tokena uwierzytelniania do odgrywania roli użytkownika sprawdzić jego integralność.
W przypadku używania wywoływalnych Cloud Functions token uwierzytelniania jest automatycznie weryfikowany i możesz go używać tak jak w tym przykładzie:
import { HttpsError, onCall } from "firebase-functions/https";
export const callableExample = onCall(async (req) => {
const authClaims = req.auth?.token;
if (!authClaims) {
throw new HttpsError("unauthenticated", "Unauthorized");
}
const favoriteSongs = await getMyFavoriteSongs(
undefined,
{ impersonate: { authClaims } }
);
// ...
});
W przeciwnym razie użyj metody verifyIdToken pakietu Admin SDK, aby zweryfikować i zdekodować
token uwierzytelniania. Załóżmy na przykład, że punkt końcowy jest zaimplementowany jako
zwykła funkcja HTTP, a token Firebase Authenticationzostał przekazany
do punktu końcowego za pomocą nagłówka authorization, zgodnie ze standardem:
import { getAuth } from "firebase-admin/auth";
import { onRequest } from "firebase-functions/https";
const auth = getAuth();
export const httpExample = onRequest(async (req, res) => {
const token = req.header("authorization")?.replace(/^bearer\s+/i, "");
if (!token) {
res.sendStatus(401);
return;
}
let authClaims;
try {
authClaims = await auth.verifyIdToken(token);
} catch {
res.sendStatus(401);
return;
}
const favoriteSongs = await getMyFavoriteSongs(
undefined,
{ impersonate: { authClaims } }
);
// ...
});
Identyfikator użytkownika, który nie pochodzi z weryfikowalnego źródła, należy określać tylko wtedy, gdy wykonujesz prawdziwe zadania administracyjne, takie jak migracja danych, w bezpiecznym środowisku, które nie jest publicznie dostępne:
// Never do this if end users can initiate execution of the code!
const favoriteSongs = await getMyFavoriteSongs(
undefined,
{ impersonate: { authClaims } }
);
Uruchamianie z nieograniczonym dostępem
Jeśli wykonujesz operację, która wymaga uprawnień administratora, pomiń parametr impersonate w wywołaniu:
await upsertSong(adminDc, {
title: songTitle_one,
instrumentsUsed: [Instrument.VOCAL],
});
Operacja wywołana w ten sposób ma pełny dostęp do bazy danych. Jeśli masz zapytania lub mutacje, które mają być używane tylko do celów administracyjnych, zdefiniuj je za pomocą dyrektywy @auth(level: NO_ACCESS). Dzięki temu tylko osoby wywołujące z uprawnieniami administratora będą mogły wykonywać te operacje.