Files
wenzi/frontend/shared/auth.ts

42 lines
1.0 KiB
TypeScript
Raw Normal View History

export const parseUserId = (value: unknown): number | null => {
if (typeof value === 'number' && Number.isFinite(value)) {
return value
}
if (typeof value === 'string' && value.trim() !== '') {
const parsed = Number(value)
return Number.isFinite(parsed) ? parsed : null
}
return null
}
export const getUserIdFromToken = (token?: string | null): number | null => {
if (!token) {
return null
}
const parts = token.split('.')
if (parts.length < 2) {
return null
}
try {
const payload = JSON.parse(decodeBase64Url(parts[1]))
return parseUserId(payload?.userId)
} catch {
return null
}
return null
}
const decodeBase64Url = (input: string): string => {
const normalized = input.replace(/-/g, '+').replace(/_/g, '/')
const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=')
const binary = atob(padded)
let result = ''
for (let i = 0; i < binary.length; i += 1) {
result += String.fromCharCode(binary.charCodeAt(i))
}
return decodeURIComponent(escape(result))
}