diff --git a/src/app/api/auth/route.ts b/src/app/api/auth/route.ts index 11160ea..55b1387 100644 --- a/src/app/api/auth/route.ts +++ b/src/app/api/auth/route.ts @@ -102,3 +102,33 @@ export async function POST(req: NextRequest) { return NextResponse.json({ message: "ok", token: relayToken.key }); } + +/** + * PUT /api/auth + * Called by the client to refresh the access token. + */ +export async function PUT(req: NextRequest) { + const refresh_token = req.cookies.get("refresh_token")?.value; + + if (!refresh_token) + return NextResponse.json( + { message: "Missing refresh_token cookie" }, + { status: StatusCodes.BAD_REQUEST } + ); + + const session = await supabase.auth.refreshSession({ refresh_token }); + + if (session.error) + return NextResponse.json( + { + message: session.error.message, + }, + { status: StatusCodes.INTERNAL_SERVER_ERROR } + ); + + return NextResponse.json({ + message: "ok", + access_token: session.data.session?.access_token, + refresh_token: session.data.session?.refresh_token, + }); +} diff --git a/src/app/auth/Login.tsx b/src/app/auth/Login.tsx index 62e9816..b5a1f18 100644 --- a/src/app/auth/Login.tsx +++ b/src/app/auth/Login.tsx @@ -27,6 +27,7 @@ export default function Login() { }); Cookies.set("token", (res.data as any).token); + Cookies.set("refresh_token", (res.data as any).refresh_token); setFeedback({ kind: "info", message: "Login successful! Redirecting...", diff --git a/src/hooks/get-user.ts b/src/hooks/get-user.ts index 82206e7..71f990f 100644 --- a/src/hooks/get-user.ts +++ b/src/hooks/get-user.ts @@ -6,6 +6,7 @@ import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { get } from "@/lib/request"; import { toast } from "sonner"; +import axios from "axios"; export interface UserProfile extends ProfileSettings { id: string; @@ -20,8 +21,18 @@ export default function useUser() { try { setUser((await get("/api/profile", (r) => setUser(r.data))).data); } catch (e: any) { - router.push("/auth?t=login"); - toast.error(`Error: ${e}`); + try { + console.log("Failed to obtain current user, refreshing token.."); + const refresh = await axios.put("/api/auth/"); + const { access_token, refresh_token } = refresh.data as any; + Cookies.set("token", access_token); + Cookies.set("refresh_token", refresh_token); + + setUser((await get("/api/profile", (r) => setUser(r.data))).data); + } catch (e: any) { + router.push("/auth?t=login"); + toast.error(`Error: ${e}`); + } } }