65 lines
1.9 KiB
TypeScript
65 lines
1.9 KiB
TypeScript
import { createServerClient } from '@supabase/ssr'
|
|
import { NextResponse, type NextRequest } from 'next/server'
|
|
|
|
export async function middleware(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: Array<{ name: string; value: string; options?: Record<string, unknown> }>) {
|
|
cookiesToSet.forEach(({ name, value }) => request.cookies.set(name, value))
|
|
supabaseResponse = NextResponse.next({
|
|
request,
|
|
})
|
|
cookiesToSet.forEach(({ name, value, options }) =>
|
|
supabaseResponse.cookies.set(name, value, options)
|
|
)
|
|
},
|
|
},
|
|
}
|
|
)
|
|
|
|
// Rafraîchir la session
|
|
const { data: { user } } = await supabase.auth.getUser()
|
|
|
|
// Si l'utilisateur est sur la page de login
|
|
if (request.nextUrl.pathname === '/login') {
|
|
if (user) {
|
|
// Utilisateur connecté, rediriger vers le dashboard
|
|
const redirectUrl = new URL('/', request.url)
|
|
return NextResponse.redirect(redirectUrl)
|
|
}
|
|
// Utilisateur non connecté, autoriser l'accès à la page de login
|
|
return supabaseResponse
|
|
}
|
|
|
|
// Pour toutes les autres pages, vérifier l'authentification
|
|
if (!user) {
|
|
// Utilisateur non connecté, rediriger vers login
|
|
const redirectUrl = new URL('/login', request.url)
|
|
return NextResponse.redirect(redirectUrl)
|
|
}
|
|
|
|
return supabaseResponse
|
|
}
|
|
|
|
export const config = {
|
|
matcher: [
|
|
/*
|
|
* Match all request paths except for the ones starting with:
|
|
* - _next/static (static files)
|
|
* - _next/image (image optimization files)
|
|
* - favicon.ico (favicon file)
|
|
* - public folder
|
|
*/
|
|
'/((?!_next/static|_next/image|favicon.ico|public|img).*)',
|
|
],
|
|
} |