feat: implement user account center with authentication, subscription management, and EVM wallet integration.

This commit is contained in:
2569718930@qq.com
2026-03-17 14:32:15 +08:00
parent 217414408c
commit 7510e0a1e0
3 changed files with 19 additions and 6 deletions
@@ -646,6 +646,13 @@ export function AccountCenter() {
} = await client.auth.refreshSession();
const refreshedToken = String(refreshed?.access_token || "").trim();
if (refreshedToken) return refreshedToken;
if (
cachedToken &&
Number.isFinite(expiresAtSec) &&
expiresAtSec > nowSec
) {
return cachedToken;
}
throw new Error(
error?.message
? isEn
+6 -6
View File
@@ -51,14 +51,14 @@ export async function buildBackendRequestHeaders(
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) {
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 };
}
+6
View File
@@ -94,6 +94,12 @@ async function handleSupabaseAuthGate(request: NextRequest) {
if (isPublicPage(pathname)) {
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({
request: {