Files
sso-portal/components/login/util.ts
2026-07-14 15:20:54 +08:00

93 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import CryptoJS from 'crypto-js'
const CODE_CRYPTO_KEY = 'k#8Mp$2Qr&9Tz@4W'
export const APP_ID = 'cli_a56577acb2f3d00c' // 飞书应用 ID与 uirefbase 相同)
export const TENANT = 'coowa'
export const validatePhoneNumber = (str: string) => {
const reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/
return reg.test(str)
}
/** 获取 url 中的某个参数值 */
export const getQueryVariable = (variable: string) => {
if (typeof window === 'undefined') return false
return new URLSearchParams(window.location.search).get(variable) || false
}
/** 加载飞书二维码 SDK */
export function qr_load() {
return new Promise<void>((resolve, reject) => {
// 如果已加载则跳过
if ((window as any).QRLogin) {
resolve()
return
}
const script = document.createElement('script')
script.type = 'text/javascript'
script.src =
'https://sf3-cn.feishucdn.com/obj/feishu-static/lark/passport/qrcode/LarkSSOSDKWebQRCode-1.0.2.js'
script.onerror = reject
script.onload = () => resolve()
document.head.appendChild(script)
})
}
/** 初始化飞书二维码 */
export async function qr_login(
appId: string,
redirect_url: string,
state: string
) {
const gotoUrl = `https://passport.feishu.cn/suite/passport/oauth/authorize?client_id=${appId}&redirect_uri=${encodeURIComponent(
redirect_url
)}&response_type=code&state=${encodeURIComponent(state)}`
const QRLogin = (window as any).QRLogin
const QRLoginObj = QRLogin({
id: 'login_container',
goto: gotoUrl,
style: `width: 270px;height: 270px;border: 0;border-radius:12px;
background-image:
radial-gradient(at 47% 33%, hsl(212.37, 72%, 59%) 0, transparent 59%),
radial-gradient(at 82% 65%, hsl(198.00, 100%, 50%) 0, transparent 55%);`,
})
const handleMessage = function (event: any) {
const origin = event.origin
if (
QRLoginObj.matchOrigin(origin) &&
window.location.href.indexOf('login') > -1
) {
const loginTmpCode = event.data
window.location.href = `${gotoUrl}&tmp_code=${loginTmpCode}`
}
}
if (typeof window.addEventListener !== 'undefined') {
window.addEventListener('message', handleMessage, false)
} else if (typeof (window as any).attachEvent !== 'undefined') {
;(window as any).attachEvent('onmessage', handleMessage)
}
}
/** 加密 — 与 uirefbase 客户端保持一致 */
export const encrypt = (data: string) => {
try {
return CryptoJS.AES.encrypt(data, CODE_CRYPTO_KEY).toString()
} catch (error) {
return data
}
}
/** 解密 */
export const decrypt = (data: string) => {
try {
const bytes = CryptoJS.AES.decrypt(data, CODE_CRYPTO_KEY)
return bytes.toString(CryptoJS.enc.Utf8)
} catch (error) {
return data
}
}