From 4e0e149f5441e9a343227ea4e17071f999d35d03 Mon Sep 17 00:00:00 2001 From: xion Date: Tue, 22 Oct 2024 23:47:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20login=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/user/store/login.ts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/pages/user/store/login.ts b/src/pages/user/store/login.ts index 8258533..c8b94cf 100644 --- a/src/pages/user/store/login.ts +++ b/src/pages/user/store/login.ts @@ -2,6 +2,33 @@ import { query } from '@/modules'; import { message } from 'antd'; import { create } from 'zustand'; import { history } from '@/utils/history'; +// 如果自己是在iframe中登录,需要调用这个方法 +export const postLoginInIframe = (token: string) => { + console.log('window.parent !== window', window.parent !== window); + if (window.parent === window) { + return; + } + // 获取父窗口的来源 + const parentOrigin = window.location.ancestorOrigins ? window.location.ancestorOrigins[0] : document.referrer; + + // 检查父窗口的来源是否合法 + const allowedOrigins = ['http://localhost', /^https?:\/\/(.+\.)?on-ai\.ai$/, /^https?:\/\/(.+\.)?xiongxiao\.me$/]; + + let targetOrigin: string | null = null; + + // 根据来源动态选择 targetOrigin + if (allowedOrigins.some((origin) => (typeof origin === 'string' ? parentOrigin.includes(origin) : origin.test(parentOrigin)))) { + targetOrigin = parentOrigin; // 使用合法来源作为 targetOrigin + } + // 如果找到合法的 targetOrigin,则发送消息 + if (targetOrigin) { + const message = { type: 'login-from-iframe', data: { token } }; + parent.postMessage(message, targetOrigin); + } else { + console.warn('Parent origin is not allowed:', parentOrigin); + } +}; + type LoginStore = { loading: boolean; setLoading: (loading: boolean) => void; @@ -35,6 +62,10 @@ export const useLoginStore = create((set, get) => { set({ isLogin: true }); query.saveToken(token); await new Promise((resolve) => setTimeout(resolve, 1000)); + if (window.parent !== window) { + postLoginInIframe(token); + await new Promise((resolve) => setTimeout(resolve, 3000)); + } const search = new URLSearchParams(window.location.search); const redirect = search.get('redirect'); if (redirect) {