index.ts 2.23 KiB
import Cookies from 'js-cookie';
const POSTMESSAGE_NAME = 'ask_qmp_qtable_token';
const COOKIE_NAME = 'ddm_token';
/** 获取(与主站共享的)登录用户token */
export function getToken() {
  let token = Cookies.get(COOKIE_NAME);
  if (token) return token;
  try {
    token = sessionStorage.getItem(COOKIE_NAME) || '';
  catch (e: any) {
    console.log('sessionStorage 被禁止访问', e.message)
  if (token) {
    Cookies.set(COOKIE_NAME, token);
  return token;
/**
 * 处理用户登录授权
 * @param MAIN_SITE_AUTH_URL 主站处理授权地址,如 http://xxx/#/auth/otherproject?asker=
 * @param MAIN_SITE_URL 主站地址
export function useAuth(MAIN_SITE_AUTH_URL: string, MAIN_SITE_URL: string) {
  const isAuthed = !!getToken()
  // 本地有 token 跳过主站点授权
  if (isAuthed) return { isAuthed };
  if (window.parent === window) {
    if (!sessionStorage.getItem('authing')) {
      // 未登录,跳转到授权页面
      sessionStorage.setItem('authing', '1');
      const currUrl = encodeURIComponent(location.href);
      location.href = `${MAIN_SITE_AUTH_URL}${currUrl}`;
    } else {
      // 授权失败
      sessionStorage.removeItem('authing');
      console.log('授权失败');
      location.href = MAIN_SITE_URL;
  } else {
    // 主站点通过 iframe + postMessage 授权中
    window.parent.postMessage(POSTMESSAGE_NAME, MAIN_SITE_URL);
    window.addEventListener('message', receiveMessage);
  function receiveMessage({ data, origin, source }: MessageEvent) {
    if (origin !== MAIN_SITE_URL) return;
    if (data.type === POSTMESSAGE_NAME) {
      sessionStorage.setItem(COOKIE_NAME, data.token);
  return { isAuthed };
/** 移除token */
export function removeToken() {
  sessionStorage.removeItem(COOKIE_NAME)
  const host = document.location.hostname
  const mainhost = host.replace(/.*?(\..*?\..*?$)/, '$1')
  Cookies.remove(COOKIE_NAME)
  Cookies.remove(COOKIE_NAME, { path: '/', domain: host })
  Cookies.remove(COOKIE_NAME, { path: '/', domain: mainhost })
  console.log('====', `${COOKIE_NAME}=0;path=/;domain=${mainhost};expires=${new Date(0).toUTCString()}`)
  document.cookie = `${COOKIE_NAME}=0;path=/;domain=${mainhost};expires=${new Date(0).toUTCString()}`