feat: implement user account center with authentication, subscription management, and EVM wallet integration.
This commit is contained in:
@@ -646,6 +646,13 @@ export function AccountCenter() {
|
|||||||
} = await client.auth.refreshSession();
|
} = await client.auth.refreshSession();
|
||||||
const refreshedToken = String(refreshed?.access_token || "").trim();
|
const refreshedToken = String(refreshed?.access_token || "").trim();
|
||||||
if (refreshedToken) return refreshedToken;
|
if (refreshedToken) return refreshedToken;
|
||||||
|
if (
|
||||||
|
cachedToken &&
|
||||||
|
Number.isFinite(expiresAtSec) &&
|
||||||
|
expiresAtSec > nowSec
|
||||||
|
) {
|
||||||
|
return cachedToken;
|
||||||
|
}
|
||||||
throw new Error(
|
throw new Error(
|
||||||
error?.message
|
error?.message
|
||||||
? isEn
|
? isEn
|
||||||
|
|||||||
@@ -51,14 +51,14 @@ export async function buildBackendRequestHeaders(
|
|||||||
headers.set(FORWARDED_SUPABASE_EMAIL_HEADER, forwardedEmail);
|
headers.set(FORWARDED_SUPABASE_EMAIL_HEADER, forwardedEmail);
|
||||||
}
|
}
|
||||||
|
|
||||||
const accessToken = session?.access_token || "";
|
|
||||||
if (accessToken) {
|
|
||||||
// Prefer server-side session token to avoid stale client bearer tokens.
|
|
||||||
headers.set("Authorization", `Bearer ${accessToken}`);
|
|
||||||
return { headers, response: passthroughResponse };
|
|
||||||
}
|
|
||||||
if (incomingAuth) {
|
if (incomingAuth) {
|
||||||
headers.set("Authorization", `Bearer ${incomingAuth}`);
|
headers.set("Authorization", `Bearer ${incomingAuth}`);
|
||||||
|
return { headers, response: passthroughResponse };
|
||||||
|
}
|
||||||
|
const accessToken = session?.access_token || "";
|
||||||
|
if (accessToken) {
|
||||||
|
// Fallback to cookie-backed session when request does not carry bearer.
|
||||||
|
headers.set("Authorization", `Bearer ${accessToken}`);
|
||||||
}
|
}
|
||||||
return { headers, response: passthroughResponse };
|
return { headers, response: passthroughResponse };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,6 +94,12 @@ async function handleSupabaseAuthGate(request: NextRequest) {
|
|||||||
if (isPublicPage(pathname)) {
|
if (isPublicPage(pathname)) {
|
||||||
return NextResponse.next();
|
return NextResponse.next();
|
||||||
}
|
}
|
||||||
|
if (pathname.startsWith("/api/")) {
|
||||||
|
const authHeader = String(request.headers.get("authorization") || "").trim();
|
||||||
|
if (/^bearer\s+\S+/i.test(authHeader)) {
|
||||||
|
return NextResponse.next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const response = NextResponse.next({
|
const response = NextResponse.next({
|
||||||
request: {
|
request: {
|
||||||
|
|||||||
Reference in New Issue
Block a user