46 lines
1.7 KiB
TypeScript
46 lines
1.7 KiB
TypeScript
import { OmsLoginType } from '@/api/rbac'
|
||
|
||
/** 解析 JWT payload(不做签名校验,仅读取客户端声明) */
|
||
export function parseJwtPayload(token: string): Record<string, unknown> | null {
|
||
const raw = token.startsWith('Bearer ') ? token.slice(7) : token
|
||
const parts = raw.split('.')
|
||
if (parts.length < 2) return null
|
||
try {
|
||
const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/')
|
||
const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4)
|
||
const json = decodeURIComponent(
|
||
atob(padded)
|
||
.split('')
|
||
.map((c) => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)
|
||
.join('')
|
||
)
|
||
return JSON.parse(json) as Record<string, unknown>
|
||
} catch {
|
||
return null
|
||
}
|
||
}
|
||
|
||
/** 从 access token 读取 RBAC mapId(user.userid,对应 t_customer.UserId) */
|
||
export function getMapIdFromAccessToken(token?: string | null): number | null {
|
||
if (!token) return null
|
||
const payload = parseJwtPayload(token)
|
||
if (!payload) return null
|
||
const raw = payload.mapId ?? payload.MapId
|
||
if (raw == null || raw === '') return null
|
||
const n = Number(raw)
|
||
return Number.isFinite(n) && n > 0 ? n : null
|
||
}
|
||
|
||
/** 从 access token 读取登录主体(claim: loginType,0=管理端 1=客户) */
|
||
export function getLoginTypeFromAccessToken(token?: string | null): OmsLoginType | null {
|
||
if (!token) return null
|
||
const payload = parseJwtPayload(token)
|
||
if (!payload) return null
|
||
const raw = payload.loginType ?? payload.LoginType
|
||
if (raw == null || raw === '') return null
|
||
const n = Number(raw)
|
||
if (n === OmsLoginType.Customer) return OmsLoginType.Customer
|
||
if (n === OmsLoginType.User) return OmsLoginType.User
|
||
return null
|
||
}
|