React Academy · Lekcja

Integracja tRPC z React Query i uwierzytelnianiem

Proszę skonfigurować integrację tRPC z React Query, dodać nagłówki uwierzytelniania i obsługiwać chronione procedury.

Lekcja 4 z 413 kroki

Integracja tRPC z React Query i uwierzytelnianiem to bezpłatna lekcja React Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Kontekst tRPC: dane dla pojedynczego żądania

Kontekst tRPC to obiekt tworzony od nowa dla każdego żądania przez funkcję createTRPCContext. Może zawierać klienta bazy danych, uwierzytelnioną sesję, nagłówki żądania lub dowolne dane specyficzne dla danego żądania, których potrzebują procedury.

Tworzenie kontekstu odbywa się przed uruchomieniem dowolnej procedury, dlatego jest to właściwe miejsce na konfigurację uwierzytelniania i połączenia z bazą danych.

Dodawanie sesji do kontekstu za pomocą NextAuth

W createTRPCContext należy wywołać getServerSession(authOptions) z next-auth/next. Wynik należy dołączyć do obiektu kontekstu: return { session: await getServerSession(authOptions), db }. Wszystkie procedury mają teraz dostęp do ctx.session.

Jeśli session ma wartość null, użytkownik nie jest uwierzytelniony. Procedury mogą to sprawdzić, aby warunkowo zwrócić dane lub zgłosić błąd.

Tworzenie chronionej procedury

Należy zdefiniować middleware sprawdzający ctx.session: const isAuthenticated = t.middleware(({ ctx, next }) => { if (!ctx.session) throw new TRPCError({ code: 'UNAUTHORIZED' }); return next({ ctx: { session: ctx.session } }); }).

Wywołanie next() przekazuje zawężony kontekst (z sesją, która nie może mieć wartości null) do kolejnych middleware i procedury obsługi.

Definicja protectedProcedure

Należy połączyć middleware z publicProcedure: const protectedProcedure = publicProcedure.use(isAuthenticated). Od tej pory każdy handler zdefiniowany za pomocą protectedProcedure.query() lub protectedProcedure.mutation() automatycznie otrzymuje w ctx sesję, która nie może mieć wartości null.

TypeScript wnioskuje, że ctx.session nie ma wartości null wewnątrz chronionych procedur, ponieważ middleware zgłosiłby błąd przed przekazaniem sterowania do handlera.

Używanie protectedProcedure

W przypadku endpointów wymagających uwierzytelnienia należy zastąpić publicProcedure przez protectedProcedure: protectedProcedure.query(({ ctx }) => getProfileFor(ctx.session.user.id)). TypeScript wie, że ctx.session nie ma tutaj wartości null, dlatego dostęp do ctx.session.user.id jest bezpieczny i nie wymaga sprawdzania wartości null.

Nieuwierzytelnione żądania automatycznie otrzymują odpowiedź 401 UNAUTHORIZED przed wykonaniem handlera.

Wysyłanie nagłówków uwierzytelniania z klienta

Należy przekazać funkcję headers do httpBatchLink: links: [httpBatchLink({ url: '/api/trpc', headers: async () => { const token = await getToken(); return { Authorization: 'Bearer ' + token }; } })]. Funkcja jest wykonywana przed każdą partią żądań.

Stosuje się to podczas uwierzytelniania tRPC z klienta React Native lub dowolnego klienta spoza Next.js, który samodzielnie zarządza tokenami uwierzytelniającymi.

Renderowanie po stronie serwera z użyciem createServerSideHelpers

W celu renderowania po stronie serwera za pomocą Pages Router w Next.js należy utworzyć pomocnika po stronie serwera: createServerSideHelpers({ router: appRouter, ctx: await createContext({ req, res }) }). W getServerSideProps należy użyć helpers.post.getAll.prefetch().

Należy zdehydratyzować wstępnie pobrany stan za pomocą dehydrate(queryClient) i przekazać go jako props. Po stronie klienta QueryClient nawodni się na podstawie tego stanu, dzięki czemu nie trzeba ponownie pobierać danych przy pierwszym ładowaniu.

Nawadnianie pamięci podręcznej zapytań tRPC w SSR

Plik _app.tsx aplikacji Next.js należy opakować komponentem Hydrate z @tanstack/react-query. Do właściwości state należy przekazać pageProps.trpcState. Spowoduje to przywrócenie po stronie klienta wstępnie pobranej pamięci podręcznej zapytań na podstawie zserializowanego stanu serwera.

Dzięki tej konfiguracji użytkownicy od razu widzą w pełni wypełnione strony, bez wskaźników ładowania po stronie klienta podczas pierwszej nawigacji.

Kody TRPCError

Należy zgłaszać TRPCError z odpowiednimi kodami zgodnymi ze znaczeniem HTTP: UNAUTHORIZED (401), FORBIDDEN (403), NOT_FOUND (404), BAD_REQUEST (400), INTERNAL_SERVER_ERROR (500). Klient tRPC mapuje je na odpowiednie stany błędów w wyniku hooka.

Pole message może zawierać szczegóły przeznaczone dla użytkownika, ale w komunikatach błędów na środowisku produkcyjnym należy unikać ujawniania poufnych informacji serwera.

tRPC z React Native

tRPC współpracuje z klientami React Native przy użyciu tego samego typu AppRouter. Należy zastąpić httpBatchLink przez httpLink (fetch w RN działa tak samo) i skonfigurować nagłówki uwierzytelniania. Adapter @trpc/react-query działa tak samo jak w konfiguracji internetowej.

Oznacza to, że monorepo może współdzielić jeden router tRPC między aplikacją internetową Next.js a aplikacją Expo React Native, zapewniając pełne bezpieczeństwo typów w obu aplikacjach.

Autoryzacja oparta na rolach

Wzorzec middleware można rozszerzyć o dostęp oparty na rolach: należy sprawdzać ctx.session.user.role i zgłaszać TRPCError({ code: 'FORBIDDEN' }), jeśli rola jest niewystarczająca. Należy utworzyć adminProcedure = publicProcedure.use(isAdmin) dla endpointów dostępnych wyłącznie dla administratorów.

W przypadku złożonej autoryzacji należy łączyć wiele middleware: publicProcedure.use(isAuthenticated).use(hasFeatureFlag('beta')).query(...).

Chroniona procedura tRPC

Jak utworzyć chronioną procedurę w tRPC, aby wymuszać uwierzytelnianie?

Podsumowanie lekcji

Kontekst tRPC jest tworzony dla każdego żądania i przechowuje sesję, klienta bazy danych oraz inne dane dostępne w zakresie danego żądania. Procedury chronione tworzy się przez dołączenie middleware sprawdzającego sesję do publicProcedure za pomocą .use(). Renderowanie po stronie serwera korzysta z createServerSideHelpers do wstępnego pobierania danych oraz z Hydrate do przywracania pamięci podręcznej po stronie klienta.

Nagłówki uwierzytelniania dla klientów spoza Next.js przekazuje się za pomocą opcji headers w httpBatchLink.

Bezpłatny start

Ucz się React dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
88
Lekcje
324

Często zadawane pytania

Czy lekcja „Integracja tRPC z React Query i uwierzytelnianiem” jest bezpłatna?

Tak — pełny tekst „Integracja tRPC z React Query i uwierzytelnianiem” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Integracja tRPC z React Query i uwierzytelnianiem”?

Proszę skonfigurować integrację tRPC z React Query, dodać nagłówki uwierzytelniania i obsługiwać chronione procedury. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Integracja tRPC z React Query i uwierzytelnianiem”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Problem rozwiązywany przez tRPC
  2. Konfiguracja tRPC z Reactem i Next.js
  3. Queries, mutacje i subskrypcje
  4. Integracja tRPC z React Query i uwierzytelnianiem
← Powrót do React Academy