From ceb1963b88778ed225fddf7db6c30e33bd2041fd Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Thu, 7 Aug 2025 11:40:13 +0800 Subject: [PATCH] auth: avoid infinite loop of redirect and auth after token is expired (#1758) --- apps/readest-app/src/app/auth/page.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/readest-app/src/app/auth/page.tsx b/apps/readest-app/src/app/auth/page.tsx index b5f9732f..6bb33272 100644 --- a/apps/readest-app/src/app/auth/page.tsx +++ b/apps/readest-app/src/app/auth/page.tsx @@ -24,6 +24,7 @@ import { start, cancel, onUrl, onInvalidUrl } from '@fabianlars/tauri-plugin-oau import { openUrl } from '@tauri-apps/plugin-opener'; import { invoke } from '@tauri-apps/api/core'; import { handleAuthCallback } from '@/helpers/auth'; +import { getUserPlan } from '@/utils/access'; import { getAppleIdAuth, Scope } from './utils/appleIdAuth'; import { authWithCustomTab, authWithSafari } from './utils/nativeAuth'; import WindowButtons from '@/components/WindowButtons'; @@ -170,8 +171,11 @@ export default function AuthPage() { const accessToken = params.get('access_token'); const refreshToken = params.get('refresh_token'); const type = params.get('type'); - const next = params.get('next') ?? '/'; if (accessToken) { + let next = params.get('next') ?? '/'; + if (getUserPlan(accessToken) === 'free') { + next = '/user'; + } handleAuthCallback({ accessToken, refreshToken, type, next, login, navigate: router.push }); } } @@ -310,7 +314,13 @@ export default function AuthPage() { if (session?.access_token && session.user) { login(session.access_token, session.user); const redirectTo = new URLSearchParams(window.location.search).get('redirect'); - router.push(redirectTo ?? '/library'); + const lastRedirectAtKey = 'lastRedirectAt'; + const lastRedirectAt = parseInt(localStorage.getItem(lastRedirectAtKey) || '0', 10); + const now = Date.now(); + localStorage.setItem(lastRedirectAtKey, now.toString()); + if (now - lastRedirectAt > 3000) { + router.push(redirectTo ?? '/library'); + } } });