mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-04 12:53:38 +00:00 
			
		
		
		
	fix: keep search params in web app url when needs authorize (#21717)
This commit is contained in:
		
							parent
							
								
									18757d07c9
								
							
						
					
					
						commit
						9588a64487
					
				@ -25,10 +25,13 @@ const Layout: FC<{
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      let appCode: string | null = null
 | 
			
		||||
      if (redirectUrl)
 | 
			
		||||
        appCode = redirectUrl?.split('/').pop() || null
 | 
			
		||||
      else
 | 
			
		||||
      if (redirectUrl) {
 | 
			
		||||
        const url = new URL(`${window.location.origin}${decodeURIComponent(redirectUrl)}`)
 | 
			
		||||
        appCode = url.pathname.split('/').pop() || null
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        appCode = pathname.split('/').pop() || null
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!appCode)
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,10 @@ export default function CheckCode() {
 | 
			
		||||
  const redirectUrl = searchParams.get('redirect_url')
 | 
			
		||||
 | 
			
		||||
  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)
 | 
			
		||||
      return null
 | 
			
		||||
 | 
			
		||||
@ -62,7 +65,7 @@ export default function CheckCode() {
 | 
			
		||||
        localStorage.setItem('webapp_access_token', ret.data.access_token)
 | 
			
		||||
        const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: ret.data.access_token })
 | 
			
		||||
        await setAccessToken(appCode, tokenResp.access_token)
 | 
			
		||||
        router.replace(redirectUrl)
 | 
			
		||||
        router.replace(decodeURIComponent(redirectUrl))
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    catch (error) { console.error(error) }
 | 
			
		||||
 | 
			
		||||
@ -23,7 +23,10 @@ const ExternalMemberSSOAuth = () => {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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)
 | 
			
		||||
      return null
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,4 @@
 | 
			
		||||
'use client'
 | 
			
		||||
import Link from 'next/link'
 | 
			
		||||
import { useCallback, useState } from 'react'
 | 
			
		||||
import { useTranslation } from 'react-i18next'
 | 
			
		||||
@ -33,7 +34,10 @@ export default function MailAndPasswordAuth({ isEmailSetup }: MailAndPasswordAut
 | 
			
		||||
  const redirectUrl = searchParams.get('redirect_url')
 | 
			
		||||
 | 
			
		||||
  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)
 | 
			
		||||
      return null
 | 
			
		||||
 | 
			
		||||
@ -87,7 +91,7 @@ export default function MailAndPasswordAuth({ isEmailSetup }: MailAndPasswordAut
 | 
			
		||||
        localStorage.setItem('webapp_access_token', res.data.access_token)
 | 
			
		||||
        const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: res.data.access_token })
 | 
			
		||||
        await setAccessToken(appCode, tokenResp.access_token)
 | 
			
		||||
        router.replace(redirectUrl)
 | 
			
		||||
        router.replace(decodeURIComponent(redirectUrl))
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        Toast.notify({
 | 
			
		||||
 | 
			
		||||
@ -23,7 +23,10 @@ const SSOAuth: FC<SSOAuthProps> = ({
 | 
			
		||||
 | 
			
		||||
  const redirectUrl = searchParams.get('redirect_url')
 | 
			
		||||
  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)
 | 
			
		||||
      return null
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -46,7 +46,10 @@ const WebSSOForm: FC = () => {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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)
 | 
			
		||||
      return null
 | 
			
		||||
 | 
			
		||||
@ -63,20 +66,20 @@ const WebSSOForm: FC = () => {
 | 
			
		||||
        localStorage.setItem('webapp_access_token', tokenFromUrl)
 | 
			
		||||
        const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: tokenFromUrl })
 | 
			
		||||
        await setAccessToken(appCode, tokenResp.access_token)
 | 
			
		||||
        router.replace(redirectUrl)
 | 
			
		||||
        router.replace(decodeURIComponent(redirectUrl))
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      if (appCode && redirectUrl && localStorage.getItem('webapp_access_token')) {
 | 
			
		||||
        const tokenResp = await fetchAccessToken({ appCode, webAppAccessToken: localStorage.getItem('webapp_access_token') })
 | 
			
		||||
        await setAccessToken(appCode, tokenResp.access_token)
 | 
			
		||||
        router.replace(redirectUrl)
 | 
			
		||||
        router.replace(decodeURIComponent(redirectUrl))
 | 
			
		||||
      }
 | 
			
		||||
    })()
 | 
			
		||||
  }, [getAppCodeFromRedirectUrl, redirectUrl, router, tokenFromUrl, message])
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    if (webAppAccessMode && webAppAccessMode === AccessMode.PUBLIC && redirectUrl)
 | 
			
		||||
      router.replace(redirectUrl)
 | 
			
		||||
      router.replace(decodeURIComponent(redirectUrl))
 | 
			
		||||
  }, [webAppAccessMode, router, redirectUrl])
 | 
			
		||||
 | 
			
		||||
  if (tokenFromUrl) {
 | 
			
		||||
 | 
			
		||||
@ -85,14 +85,6 @@ const TextGeneration: FC<IMainProps> = ({
 | 
			
		||||
 | 
			
		||||
  const router = useRouter()
 | 
			
		||||
  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
 | 
			
		||||
  const [isCallBatchAPI, setIsCallBatchAPI] = useState(false)
 | 
			
		||||
 | 
			
		||||
@ -110,7 +110,7 @@ function unicodeToChar(text: string) {
 | 
			
		||||
 | 
			
		||||
function requiredWebSSOLogin(message?: string, code?: number) {
 | 
			
		||||
  const params = new URLSearchParams()
 | 
			
		||||
  params.append('redirect_url', globalThis.location.pathname)
 | 
			
		||||
  params.append('redirect_url', encodeURIComponent(`${globalThis.location.pathname}${globalThis.location.search}`))
 | 
			
		||||
  if (message)
 | 
			
		||||
    params.append('message', message)
 | 
			
		||||
  if (code)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user