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(); } = 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
+6 -6
View File
@@ -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 };
} }
+6
View File
@@ -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: {