28 lines
982 B
TypeScript
28 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
|