Supabase
Odświeżanie sesji Supabase wewnątrz łańcucha NEMO: ciasteczka trafiają do odpowiedzi, a kolejne funkcje widzą już zalogowanego użytkownika.
Instalacja
Supabase podłącz do projektu według oficjalnych przewodników:
Supabase Quickstart albo Supabase Next.js App
Pod NEMO trzeba w nich zmienić dosłownie jedno miejsce.
Wpięcie w łańcuch NEMO
Utwórz _middleware.ts
Załóż plik _middleware.ts w katalogu lib albo supabase i wklej do niego kod middleware
skopiowany z dokumentacji Supabase.
Powinien wyglądać mniej więcej tak:
import { createServerClient } from '@supabase/ssr';
import { type NextRequest, NextResponse } from 'next/server';
export async function updateSession(request: NextRequest) {
let supabaseResponse = NextResponse.next({
request,
})
const supabase = createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
{
cookies: {
getAll() {
return request.cookies.getAll()
},
setAll(cookiesToSet) {
cookiesToSet.forEach(({ name, value, options }) => request.cookies.set(name, value))
supabaseResponse = NextResponse.next({
request,
})
cookiesToSet.forEach(({ name, value, options }) =>
supabaseResponse.cookies.set(name, value, options)
)
},
},
}
);
// refreshing the auth token
await supabase.auth.getUser();
return supabaseResponse;
}
Podepnij updateSession pod before
W głównym pliku middleware albo proxy updateSession trafia do łańcucha before - dzięki
temu token odświeży się, zanim ruszy cokolwiek innego.
import { type MiddlewareConfig, type GlobalMiddlewareConfig, createNEMO } from '@zanreal/nemo';
import { updateSession } from '@/lib/supabase/middleware';
const globalMiddlewares: GlobalMiddlewareConfig = {
before: updateSession, // REMEMBER TO IMPORT updateSession
}
const middlewares: MiddlewareConfig = {
'/': [
async (request) => {
console.log('There is NEMO', request.nextUrl.pathname);
},
],
};
export const proxy = createNEMO(middlewares, globalMiddlewares);
export const config = {
matcher: ['/((?!_next/|_static|_vercel|[\\w-]+\\.\\w+).*)'],
};
import { type MiddlewareConfig, type GlobalMiddlewareConfig, createNEMO } from '@zanreal/nemo';
import { updateSession } from '@/lib/supabase/middleware';
const globalMiddlewares: GlobalMiddlewareConfig = {
before: updateSession, // REMEMBER TO IMPORT updateSession
}
const middlewares: MiddlewareConfig = {
'/': [
async (request) => {
console.log('There is NEMO', request.nextUrl.pathname);
},
],
};
export const middleware = createNEMO(middlewares, globalMiddlewares);
export const config = {
matcher: ['/((?!_next/|_static|_vercel|[\\w-]+\\.\\w+).*)'],
};
(Opcjonalnie) Odłóż użytkownika do storage
updateSession i tak pyta Supabase o zalogowanego użytkownika, więc warto od razu zapisać
wynik dla pozostałych funkcji w łańcuchu:
// imports
export async function updateSession(request, { storage }) {
// prev code
// refreshing the auth token
await supabase.auth.getUser();
const { user } = await supabase.auth.getUser();
// add user to storage
storage.set('user', user ?? undefined);
return supabaseResponse;
}
Czy ta strona była pomocna?
M↓obsługiwane.