42 lines
1.0 KiB
TypeScript
42 lines
1.0 KiB
TypeScript
|
|
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))
|
||
|
|
}
|