Skip to content

@sud-web/utils

通用浏览器工具包,目前包含 CSRF Token 本地缓存工具、统一登录跳转工具和认证 code 常量。

安装

bash
pnpm add @sud-web/utils

导出

ts
import {
  AUTHKEYNAME,
  getCsrfToken,
  setCsrfToken,
  removeCsrfToken,
  redirectToLogin
} from '@sud-web/utils'
API说明
AUTHKEYNAMEAuth 回跳 code 参数名,当前为 sud_auth_code
getCsrfTokenlocalStorage 读取 CSRF Token
setCsrfToken写入 CSRF Token
removeCsrfToken删除 CSRF Token
redirectToLogin清理 Token 并跳转到统一认证系统

Token 工具

Token 默认存储在 localStoragex-xsrf-token key 下。

ts
setCsrfToken('token')

const token = getCsrfToken()

removeCsrfToken()
方法参数返回
getCsrfToken()`string
setCsrfToken(token)token: stringvoid
removeCsrfToken()void

redirectToLogin

用于跳转到统一 Auth(SSO)系统。执行跳转前会调用 removeCsrfToken(),并清理回跳地址里的 sud_auth_code 参数,避免重复跳转时 code 堆积。

它有两种跳转方式,由 autoLogin 决定:

  • autoLogin: true(走后端,form 探测):创建隐藏 form,用 GET 提交到 redirectAction(后端接口)。本质是「探测用户是否已经在统一登录中心登录」——已登录就带 code 302 回来,未登录则进登录页。
  • autoLogin 不传(走前端 location.href):直接 location.href 跳到 authBaseUrl + authPath(auth 前端域名的某个路由),常用于主动退出

实际使用(项目封装)

业务侧一般不直接调用包里的 redirectToLogin,而是按自己项目的 env / channel 再封装一层,对外暴露「登录」「退出」两个场景。下面是 customer 项目的真实封装:

ts
// 对 SSO 跳转的二次封装:把项目固定的 env / channel 收口,对外只暴露 scene
import { redirectToLogin as redirectToSSO } from '@sud-web/utils'

interface IRedirectToLoginParams {
  /** auth 前端系统的指定路由,如 /logout */
  authPath?: string
  /** 默认 location.href,可指定回跳地址 */
  redirect_uri?: string
  /** 默认 login;logout 用于主动退出 */
  scene?: 'login' | 'logout'
}

export function redirectToLogin(props: IRedirectToLoginParams = {}) {
  const { authPath = '', redirect_uri, scene = 'login' } = props

  const baseParams = {
    authPath,
    authBaseUrl: import.meta.env.VITE_AUTH_BASE_URL, // auth 前端域名
    channel: 'official',
    redirect_uri
  }

  // 主动退出:跳 auth 前端域名的 /logout 路由,并关闭登录后的授权页
  if (scene === 'logout') {
    redirectToSSO({ ...baseParams, showLoginConfirm: '0' })
    return
  }

  // 登录态探测:走后端 redirectAction,用隐藏 form 提交
  redirectToSSO({
    ...baseParams,
    autoLogin: true,
    redirectAction: import.meta.env.VITE_PUBLIC_AUTH_REDIRECT_ACTION
  })
}

调用方只关心场景:

ts
// 进入页面发现未登录 / token 失效:探测登录态
redirectToLogin()

// 用户点「退出登录」:跳 auth 前端 /logout 自动退出
redirectToLogin({ scene: 'logout', authPath: '/logout' })

redirectAction后端接口地址,按环境区分,通常配在 env 里(VITE_PUBLIC_AUTH_REDIRECT_ACTION):

环境redirectAction
devhttps://dev-auth.sud.tech/api/login/redirect
fathttps://fat-auth.sud.tech/api/login/redirect
prodhttps://auth.sud.tech/api/login/redirect

直接调用(不封装)

不封装时,直接传包要求的参数。最小调用:

ts
import { redirectToLogin } from '@sud-web/utils'

redirectToLogin({
  authBaseUrl: import.meta.env.VITE_AUTH_BASE_URL,
  channel: 'official'
})

默认使用当前 location.href 作为 redirect_uri

authPath(主动退出)

authPath要进入 auth 前端系统的哪个路由。最终跳转地址是 authBaseUrl + authPath。主动退出时填 /logout,会跳到 auth 前端域名的 /logout 路由自动执行退出:

ts
redirectToLogin({
  authBaseUrl: 'https://auth.sud.tech',
  authPath: '/logout',
  channel: 'official'
})
// → https://auth.sud.tech/logout?channel=official&redirect_uri=...

autoLogin + redirectAction(登录态探测)

autoLogin: true 时不走 location.href,而是创建隐藏 form,用 GET 提交到 redirectAction探测用户是否已在统一登录中心登录

ts
redirectToLogin({
  authBaseUrl: 'https://auth.sud.tech',
  channel: 'official',
  autoLogin: true,
  redirectAction: 'https://auth.sud.tech/api/login/redirect'
})

autoLogin 场景下 redirectAction(后端接口地址)必填,否则报错返回。

tokenFailReturn

仅在 autoLogin: true(走后端探测)时使用。设为 true 时,不管用户是否已登录,都只会 302 回到原来的地址,不会强制进入登录页。一般用在非登录态也允许访问网站的场景(如官网)。

ts
redirectToLogin({
  authBaseUrl: 'https://auth.sud.tech',
  channel: 'official',
  autoLogin: true,
  redirectAction: 'https://auth.sud.tech/api/login/redirect',
  tokenFailReturn: true
})
入参最终参数
truetokenFailReturn=1
'custom'tokenFailReturn=custom
不传不追加该参数

不设置时,则按登录态决定:已登录带 code 302 回来,未登录跳登录页。

showLoginConfirm

showLoginConfirm 控制登录成功后是否展示授权页面

ts
redirectToLogin({
  authBaseUrl: 'https://auth.sud.tech',
  channel: 'official',
  showLoginConfirm: '0'
})
入参登录成功后行为
'0'不展示授权页,直接回跳 redirect_uri
不传 / '1'展示授权确认页

showLoginConfirm 只在 location.href 跳转分支生效(即不开 autoLogin,例如主动退出场景)。autoLogin 的 form 提交不会携带该参数。

debug

ts
redirectToLogin({
  authBaseUrl: 'https://auth.sud.tech',
  channel: 'official',
  debug: true
})

debug: true 会完成参数计算和 Token 清理,但不会真正跳转,便于本地调试。

参数

ts
interface IRedirectToLoginParams {
  channel: string
  authBaseUrl: string
  authPath?: string
  autoLogin?: boolean
  redirectAction?: string
  showLoginConfirm?: '0' | '1'
  redirect_uri?: string
  tokenFailReturn?: boolean | string
  debug?: boolean
}
参数类型必填默认值说明
channelstring-平台来源标识(如 official
authBaseUrlstring-Auth 前端系统基础域名
authPathstring''要进入 auth 前端的路由,主动退出填 /logout
autoLoginbooleanfalsetrue 时用隐藏 form 提交到后端 redirectAction,探测登录态
redirectActionstring条件必填-autoLogin=true 时的后端接口地址,按环境区分
showLoginConfirm'0' | '1'-登录成功后是否展示授权页,'0' 不展示直接回跳;仅 location.href 分支生效
redirect_uristringlocation.href登录完成后的回跳地址
tokenFailReturnboolean | string-autoLogin 时;true 则无论是否登录都 302 回原地址,用于允许未登录访问的站点
debugbooleanfalse只打印跳转地址,不执行跳转

校验与错误

场景行为
authBaseUrl 为空console.error('authBaseUrl must be has value') 后返回
channel 为空console.error('channel must be has value') 后返回
autoLogin=true 且缺少 redirectActionconsole.error('redirectAction must be has value when autoLogin is true') 后返回

测试

bash
cd packages/utils
pnpm test