27 lines
982 B
TypeScript
27 lines
982 B
TypeScript
/**
|
||
* jwt-decode yerine kullanılan minimal çözücü.
|
||
*
|
||
* Sadece payload okunuyor; imza doğrulaması zaten sunucunun işi. Token
|
||
* base64url kodlu olduğu için `-`/`_` çevrilir ve padding tamamlanır;
|
||
* ayrıca Türkçe karakter içeren claim'lerin bozulmaması için atob çıktısı
|
||
* UTF-8 olarak yeniden çözülür.
|
||
*/
|
||
export const jwtDecode = <T = Record<string, unknown>>(token: string): T => {
|
||
const payload = token?.split('.')[1]
|
||
if (!payload) {
|
||
throw new Error('Invalid token specified: missing payload')
|
||
}
|
||
|
||
const base64 = payload.replace(/-/g, '+').replace(/_/g, '/')
|
||
const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=')
|
||
|
||
try {
|
||
const binary = atob(padded)
|
||
const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0))
|
||
return JSON.parse(new TextDecoder().decode(bytes)) as T
|
||
} catch {
|
||
throw new Error('Invalid token specified: payload could not be decoded')
|
||
}
|
||
}
|
||
|
||
export default jwtDecode
|