✨ Refreshing token
This commit is contained in:
parent
6aced3ddf7
commit
ac4afdcf06
@ -1,12 +1,68 @@
|
||||
import axios from 'axios'
|
||||
import axios, { AxiosInstance } from 'axios'
|
||||
import applyCaseMiddleware from 'axios-case-converter'
|
||||
import { hasCookie, getCookie, setCookie } from 'cookies-next/client'
|
||||
|
||||
export let sni = applyCaseMiddleware(
|
||||
axios.create({
|
||||
baseURL: 'https://api.sn.solsynth.dev',
|
||||
}),
|
||||
{
|
||||
const baseURL = 'https://api.solsynth.dev'
|
||||
|
||||
export let sni: AxiosInstance = (() => {
|
||||
const inst = axios.create({
|
||||
baseURL,
|
||||
})
|
||||
|
||||
inst.interceptors.request.use(
|
||||
async (config) => {
|
||||
const tk = await refreshToken()
|
||||
if (tk) config.headers['Authorization'] = `Bearer ${tk}`
|
||||
return config
|
||||
},
|
||||
(error) => error,
|
||||
)
|
||||
|
||||
applyCaseMiddleware(inst, {
|
||||
ignoreParams: true,
|
||||
ignoreHeaders: true,
|
||||
},
|
||||
)
|
||||
})
|
||||
return inst
|
||||
})()
|
||||
|
||||
async function refreshToken(): Promise<string | undefined> {
|
||||
if (!hasCookie('nex_user_atk') || !hasCookie('nex_user_rtk')) return
|
||||
|
||||
const ogTk: string = getCookie('nex_user_atk')!
|
||||
if (!isTokenExpired(ogTk)) return
|
||||
|
||||
const resp = await axios.post('/cgi/id/auth/token', {
|
||||
refresh_token: getCookie('nex_user_rtk')!,
|
||||
grant_type: 'refresh_token',
|
||||
})
|
||||
const atk: string = resp.data['accessToken']
|
||||
const rtk: string = resp.data['refreshToken']
|
||||
setCookie('nex_user_atk', atk, { path: '/', maxAge: 2592000 })
|
||||
setCookie('nex_user_rtk', rtk, { path: '/', maxAge: 2592000 })
|
||||
|
||||
console.log('[Authenticator] Refreshed token...')
|
||||
|
||||
return atk
|
||||
}
|
||||
|
||||
function isTokenExpired(token: string): boolean {
|
||||
try {
|
||||
const parts = token.split('.')
|
||||
if (parts.length !== 3) {
|
||||
throw new Error('Invalid JWT format')
|
||||
}
|
||||
|
||||
const payload = JSON.parse(atob(parts[1]))
|
||||
|
||||
if (!payload.exp) {
|
||||
throw new Error("'exp' claim is missing in the JWT payload")
|
||||
}
|
||||
|
||||
const now = Math.floor(Date.now() / 1000)
|
||||
|
||||
return now >= payload.exp
|
||||
} catch (error) {
|
||||
console.error('[Authenticator] Something went wrong with token: ', error)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user