fix: keep search params in web app url when needs authorize (#21717)

This commit is contained in:
NFish
2025-06-30 18:28:31 +08:00
committed by GitHub
parent 18757d07c9
commit 9588a64487
8 changed files with 33 additions and 22 deletions

View File

@@ -25,10 +25,13 @@ const Layout: FC<{
} }
let appCode: string | null = null let appCode: string | null = null
if (redirectUrl) if (redirectUrl) {
appCode = redirectUrl?.split('/').pop() || null const url = new URL(`${window.location.origin}${decodeURIComponent(redirectUrl)}`)
else appCode = url.pathname.split('/').pop() || null
}
else {
appCode = pathname.split('/').pop() || null appCode = pathname.split('/').pop() || null
}
if (!appCode) if (!appCode)
return return

View File

@@ -25,7 +25,10 @@ export default function CheckCode() {
const redirectUrl = searchParams.get('redirect_url') const redirectUrl = searchParams.get('redirect_url')
const getAppCodeFromRedirectUrl = useCallback(() => { const getAppCodeFromRedirectUrl = useCallback(() => {
const appCode = redirectUrl?.split('/').pop() if (!redirectUrl)
return null
const url = new URL(`${window.location.origin}${decodeURIComponent(redirectUrl)}`)
const appCode = url.pathname.split('/').pop()
if (!appCode) if (!appCode)
return null return null
@@ -62,7 +65,7 @@ export default function CheckCode() {
localStorage.setItem('webapp_access_token', ret.data.access_token) localStorage.setItem('webapp_access_token', ret.data.access_token)
const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: ret.data.access_token }) const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: ret.data.access_token })
await setAccessToken(appCode, tokenResp.access_token) await setAccessToken(appCode, tokenResp.access_token)
router.replace(redirectUrl) router.replace(decodeURIComponent(redirectUrl))
} }
} }
catch (error) { console.error(error) } catch (error) { console.error(error) }

View File

@@ -23,7 +23,10 @@ const ExternalMemberSSOAuth = () => {
} }
const getAppCodeFromRedirectUrl = useCallback(() => { const getAppCodeFromRedirectUrl = useCallback(() => {
const appCode = redirectUrl?.split('/').pop() if (!redirectUrl)
return null
const url = new URL(`${window.location.origin}${decodeURIComponent(redirectUrl)}`)
const appCode = url.pathname.split('/').pop()
if (!appCode) if (!appCode)
return null return null

View File

@@ -1,3 +1,4 @@
'use client'
import Link from 'next/link' import Link from 'next/link'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@@ -33,7 +34,10 @@ export default function MailAndPasswordAuth({ isEmailSetup }: MailAndPasswordAut
const redirectUrl = searchParams.get('redirect_url') const redirectUrl = searchParams.get('redirect_url')
const getAppCodeFromRedirectUrl = useCallback(() => { const getAppCodeFromRedirectUrl = useCallback(() => {
const appCode = redirectUrl?.split('/').pop() if (!redirectUrl)
return null
const url = new URL(`${window.location.origin}${decodeURIComponent(redirectUrl)}`)
const appCode = url.pathname.split('/').pop()
if (!appCode) if (!appCode)
return null return null
@@ -87,7 +91,7 @@ export default function MailAndPasswordAuth({ isEmailSetup }: MailAndPasswordAut
localStorage.setItem('webapp_access_token', res.data.access_token) localStorage.setItem('webapp_access_token', res.data.access_token)
const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: res.data.access_token }) const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: res.data.access_token })
await setAccessToken(appCode, tokenResp.access_token) await setAccessToken(appCode, tokenResp.access_token)
router.replace(redirectUrl) router.replace(decodeURIComponent(redirectUrl))
} }
else { else {
Toast.notify({ Toast.notify({

View File

@@ -23,7 +23,10 @@ const SSOAuth: FC<SSOAuthProps> = ({
const redirectUrl = searchParams.get('redirect_url') const redirectUrl = searchParams.get('redirect_url')
const getAppCodeFromRedirectUrl = useCallback(() => { const getAppCodeFromRedirectUrl = useCallback(() => {
const appCode = redirectUrl?.split('/').pop() if (!redirectUrl)
return null
const url = new URL(`${window.location.origin}${decodeURIComponent(redirectUrl)}`)
const appCode = url.pathname.split('/').pop()
if (!appCode) if (!appCode)
return null return null

View File

@@ -46,7 +46,10 @@ const WebSSOForm: FC = () => {
} }
const getAppCodeFromRedirectUrl = useCallback(() => { const getAppCodeFromRedirectUrl = useCallback(() => {
const appCode = redirectUrl?.split('/').pop() if (!redirectUrl)
return null
const url = new URL(`${window.location.origin}${decodeURIComponent(redirectUrl)}`)
const appCode = url.pathname.split('/').pop()
if (!appCode) if (!appCode)
return null return null
@@ -63,20 +66,20 @@ const WebSSOForm: FC = () => {
localStorage.setItem('webapp_access_token', tokenFromUrl) localStorage.setItem('webapp_access_token', tokenFromUrl)
const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: tokenFromUrl }) const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: tokenFromUrl })
await setAccessToken(appCode, tokenResp.access_token) await setAccessToken(appCode, tokenResp.access_token)
router.replace(redirectUrl) router.replace(decodeURIComponent(redirectUrl))
return return
} }
if (appCode && redirectUrl && localStorage.getItem('webapp_access_token')) { if (appCode && redirectUrl && localStorage.getItem('webapp_access_token')) {
const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: localStorage.getItem('webapp_access_token') }) const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: localStorage.getItem('webapp_access_token') })
await setAccessToken(appCode, tokenResp.access_token) await setAccessToken(appCode, tokenResp.access_token)
router.replace(redirectUrl) router.replace(decodeURIComponent(redirectUrl))
} }
})() })()
}, [getAppCodeFromRedirectUrl, redirectUrl, router, tokenFromUrl, message]) }, [getAppCodeFromRedirectUrl, redirectUrl, router, tokenFromUrl, message])
useEffect(() => { useEffect(() => {
if (webAppAccessMode && webAppAccessMode === AccessMode.PUBLIC && redirectUrl) if (webAppAccessMode && webAppAccessMode === AccessMode.PUBLIC && redirectUrl)
router.replace(redirectUrl) router.replace(decodeURIComponent(redirectUrl))
}, [webAppAccessMode, router, redirectUrl]) }, [webAppAccessMode, router, redirectUrl])
if (tokenFromUrl) { if (tokenFromUrl) {

View File

@@ -85,14 +85,6 @@ const TextGeneration: FC<IMainProps> = ({
const router = useRouter() const router = useRouter()
const pathname = usePathname() const pathname = usePathname()
useEffect(() => {
const params = new URLSearchParams(searchParams)
if (params.has('mode')) {
params.delete('mode')
router.replace(`${pathname}?${params.toString()}`)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
// Notice this situation isCallBatchAPI but not in batch tab // Notice this situation isCallBatchAPI but not in batch tab
const [isCallBatchAPI, setIsCallBatchAPI] = useState(false) const [isCallBatchAPI, setIsCallBatchAPI] = useState(false)

View File

@@ -110,7 +110,7 @@ function unicodeToChar(text: string) {
function requiredWebSSOLogin(message?: string, code?: number) { function requiredWebSSOLogin(message?: string, code?: number) {
const params = new URLSearchParams() const params = new URLSearchParams()
params.append('redirect_url', globalThis.location.pathname) params.append('redirect_url', encodeURIComponent(`${globalThis.location.pathname}${globalThis.location.search}`))
if (message) if (message)
params.append('message', message) params.append('message', message)
if (code) if (code)