From 06e53f3974497d6687bdebd17548c384c75df19a Mon Sep 17 00:00:00 2001 From: n4mlz Date: Tue, 1 Sep 2026 11:15:56 +0900 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Auth0=20=E3=83=88=E3=83=BC?= =?UTF-8?q?=E3=82=AF=E3=83=B3=E6=9C=9F=E9=99=90=E5=88=87=E3=82=8C=E6=99=82?= =?UTF-8?q?=E3=81=AE=E5=86=8D=E8=AA=8D=E8=A8=BC=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/api.ts | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/api.ts b/lib/api.ts index 71f4348..b6bb8eb 100644 --- a/lib/api.ts +++ b/lib/api.ts @@ -1,3 +1,9 @@ +import { + AccessTokenError, + AccessTokenErrorCode, +} from "@auth0/nextjs-auth0/errors"; +import { redirect } from "next/navigation"; + import { auth0 } from "@/lib/auth0"; export type Sheet = { @@ -33,10 +39,31 @@ export async function fetchMusics( searchParams: { cursor?: string; limit?: number } = {}, ): Promise { const audience = process.env.AUTH0_AUDIENCE ?? "https://api.xlair.dev"; - const accessToken = await auth0.getAccessToken({ audience }); const params = new URLSearchParams(); if (searchParams.cursor) params.set("cursor", searchParams.cursor); if (searchParams.limit) params.set("limit", String(searchParams.limit)); + const returnTo = `/musics${params.size ? `?${params.toString()}` : ""}`; + + let accessToken: Awaited>; + try { + accessToken = await auth0.getAccessToken({ audience }); + } catch (error) { + if ( + error instanceof AccessTokenError && + [ + AccessTokenErrorCode.MISSING_REFRESH_TOKEN, + AccessTokenErrorCode.FAILED_TO_REFRESH_TOKEN, + AccessTokenErrorCode.SESSION_EXPIRED, + ].includes(error.code as AccessTokenErrorCode) + ) { + const loginParams = new URLSearchParams({ + prompt: "login", + returnTo, + }); + redirect(`/auth/login?${loginParams.toString()}`); + } + throw error; + } const response = await fetch( `${process.env.API_BASE_URL}/admin/musics?${params.toString()}`,