diff --git a/web/app/(shareLayout)/webapp-signin/page.tsx b/web/app/(shareLayout)/webapp-signin/page.tsx
index c12fde38dd..07b7c88430 100644
--- a/web/app/(shareLayout)/webapp-signin/page.tsx
+++ b/web/app/(shareLayout)/webapp-signin/page.tsx
@@ -23,10 +23,12 @@ const WebSSOForm: FC = () => {
const redirectUrl = searchParams.get('redirect_url')
const tokenFromUrl = searchParams.get('web_sso_token')
const message = searchParams.get('message')
+ const code = searchParams.get('code')
const getSigninUrl = useCallback(() => {
const params = new URLSearchParams(searchParams)
params.delete('message')
+ params.delete('code')
return `/webapp-signin?${params.toString()}`
}, [searchParams])
@@ -85,8 +87,8 @@ const WebSSOForm: FC = () => {
if (message) {
return
-
-
{t('share.login.backToHome')}
+
+
{code === '403' ? t('common.userProfile.logout') : t('share.login.backToHome')}
}
if (!redirectUrl) {
diff --git a/web/app/components/base/chat/chat-with-history/index.tsx b/web/app/components/base/chat/chat-with-history/index.tsx
index 1fd1383196..fe8e7b430d 100644
--- a/web/app/components/base/chat/chat-with-history/index.tsx
+++ b/web/app/components/base/chat/chat-with-history/index.tsx
@@ -1,5 +1,7 @@
+'use client'
import type { FC } from 'react'
import {
+ useCallback,
useEffect,
useState,
} from 'react'
@@ -17,10 +19,12 @@ import ChatWrapper from './chat-wrapper'
import type { InstalledApp } from '@/models/explore'
import Loading from '@/app/components/base/loading'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
-import { checkOrSetAccessToken } from '@/app/components/share/utils'
+import { checkOrSetAccessToken, removeAccessToken } from '@/app/components/share/utils'
import AppUnavailable from '@/app/components/base/app-unavailable'
import cn from '@/utils/classnames'
import useDocumentTitle from '@/hooks/use-document-title'
+import { useTranslation } from 'react-i18next'
+import { usePathname, useRouter, useSearchParams } from 'next/navigation'
type ChatWithHistoryProps = {
className?: string
@@ -38,6 +42,7 @@ const ChatWithHistory: FC = ({
isMobile,
themeBuilder,
sidebarCollapseState,
+ isInstalledApp,
} = useChatWithHistoryContext()
const isSidebarCollapsed = sidebarCollapseState
const customConfig = appData?.custom_config
@@ -51,13 +56,34 @@ const ChatWithHistory: FC = ({
useDocumentTitle(site?.title || 'Chat')
+ const { t } = useTranslation()
+ const searchParams = useSearchParams()
+ const router = useRouter()
+ const pathname = usePathname()
+ const getSigninUrl = useCallback(() => {
+ const params = new URLSearchParams(searchParams)
+ params.delete('message')
+ params.set('redirect_url', pathname)
+ return `/webapp-signin?${params.toString()}`
+ }, [searchParams, pathname])
+
+ const backToHome = useCallback(() => {
+ removeAccessToken()
+ const url = getSigninUrl()
+ router.replace(url)
+ }, [getSigninUrl, router])
+
if (appInfoLoading) {
return (
)
}
- if (!userCanAccess)
- return
+ if (!userCanAccess) {
+ return
+
+ {!isInstalledApp &&
{t('common.userProfile.logout')}}
+
+ }
if (appInfoError) {
return (
diff --git a/web/app/components/base/chat/embedded-chatbot/index.tsx b/web/app/components/base/chat/embedded-chatbot/index.tsx
index 002d142542..c54afd78ea 100644
--- a/web/app/components/base/chat/embedded-chatbot/index.tsx
+++ b/web/app/components/base/chat/embedded-chatbot/index.tsx
@@ -1,4 +1,6 @@
+'use client'
import {
+ useCallback,
useEffect,
useState,
} from 'react'
@@ -12,7 +14,7 @@ import { useEmbeddedChatbot } from './hooks'
import { isDify } from './utils'
import { useThemeContext } from './theme/theme-context'
import { CssTransform } from './theme/utils'
-import { checkOrSetAccessToken } from '@/app/components/share/utils'
+import { checkOrSetAccessToken, removeAccessToken } from '@/app/components/share/utils'
import AppUnavailable from '@/app/components/base/app-unavailable'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import Loading from '@/app/components/base/loading'
@@ -23,6 +25,7 @@ import DifyLogo from '@/app/components/base/logo/dify-logo'
import cn from '@/utils/classnames'
import useDocumentTitle from '@/hooks/use-document-title'
import { useGlobalPublicStore } from '@/context/global-public-context'
+import { usePathname, useRouter, useSearchParams } from 'next/navigation'
const Chatbot = () => {
const {
@@ -36,6 +39,7 @@ const Chatbot = () => {
chatShouldReloadKey,
handleNewConversation,
themeBuilder,
+ isInstalledApp,
} = useEmbeddedChatbotContext()
const { t } = useTranslation()
const systemFeatures = useGlobalPublicStore(s => s.systemFeatures)
@@ -51,6 +55,22 @@ const Chatbot = () => {
useDocumentTitle(site?.title || 'Chat')
+ const searchParams = useSearchParams()
+ const router = useRouter()
+ const pathname = usePathname()
+ const getSigninUrl = useCallback(() => {
+ const params = new URLSearchParams(searchParams)
+ params.delete('message')
+ params.set('redirect_url', pathname)
+ return `/webapp-signin?${params.toString()}`
+ }, [searchParams, pathname])
+
+ const backToHome = useCallback(() => {
+ removeAccessToken()
+ const url = getSigninUrl()
+ router.replace(url)
+ }, [getSigninUrl, router])
+
if (appInfoLoading) {
return (
<>
@@ -66,8 +86,12 @@ const Chatbot = () => {
)
}
- if (!userCanAccess)
- return
+ if (!userCanAccess) {
+ return
+
+ {!isInstalledApp &&
{t('common.userProfile.logout')}}
+
+ }
if (appInfoError) {
return (
@@ -141,7 +165,6 @@ const EmbeddedChatbotWrapper = () => {
appInfoError,
appInfoLoading,
appData,
- accessMode,
userCanAccess,
appParams,
appMeta,
@@ -176,7 +199,6 @@ const EmbeddedChatbotWrapper = () => {
return = ({
)
+ const getSigninUrl = useCallback(() => {
+ const params = new URLSearchParams(searchParams)
+ params.delete('message')
+ params.set('redirect_url', pathname)
+ return `/webapp-signin?${params.toString()}`
+ }, [searchParams, pathname])
+
+ const backToHome = useCallback(() => {
+ removeAccessToken()
+ const url = getSigninUrl()
+ router.replace(url)
+ }, [getSigninUrl, router])
+
if (!appId || !siteInfo || !promptConfig || (systemFeatures.webapp_auth.enabled && (isGettingAccessMode || isCheckingPermission))) {
return (
)
}
- if (systemFeatures.webapp_auth.enabled && !userCanAccessResult?.result)
- return
+ if (systemFeatures.webapp_auth.enabled && !userCanAccessResult?.result) {
+ return
+
+ {!isInstalledApp &&
{t('common.userProfile.logout')}}
+
+ }
return (
{
if (isPublicAPI) {
if (data.code === 'web_app_access_denied')
- requiredWebSSOLogin(data.message)
+ requiredWebSSOLogin(data.message, 403)
- if (data.code === 'web_sso_auth_required')
+ if (data.code === 'web_sso_auth_required') {
+ removeAccessToken()
requiredWebSSOLogin()
+ }
if (data.code === 'unauthorized') {
removeAccessToken()
@@ -484,10 +487,11 @@ export const request = async(url: string, options = {}, otherOptions?: IOther
const { code, message } = errRespData
// webapp sso
if (code === 'web_app_access_denied') {
- requiredWebSSOLogin(message)
+ requiredWebSSOLogin(message, 403)
return Promise.reject(err)
}
if (code === 'web_sso_auth_required') {
+ removeAccessToken()
requiredWebSSOLogin()
return Promise.reject(err)
}