67 lines
1.7 KiB
TypeScript
67 lines
1.7 KiB
TypeScript
import TokenAPI, { Token } from '@/client/idp/token'
|
|
import {
|
|
loadAccessToken,
|
|
loadRefreshToken,
|
|
loadTokenExpiry,
|
|
removeAccessToken,
|
|
removeRefreshToken,
|
|
removeTokenExpiry,
|
|
saveAccessToken,
|
|
saveRefreshToken,
|
|
saveTokenExpiry,
|
|
} from '@/local-storage'
|
|
|
|
export const COOKIE = 'voltaserve_access_token'
|
|
|
|
export async function saveToken(token: Token) {
|
|
document.cookie = `${COOKIE}=${token.access_token}; Path=/; Max-Age=${token.expires_in}`
|
|
saveAccessToken(token.access_token)
|
|
saveRefreshToken(token.refresh_token)
|
|
const tokenExpiry = new Date()
|
|
tokenExpiry.setSeconds(tokenExpiry.getSeconds() + token.expires_in)
|
|
saveTokenExpiry(tokenExpiry.toISOString())
|
|
}
|
|
|
|
export async function clearToken() {
|
|
document.cookie = `${COOKIE}=; Max-Age=-99999999;`
|
|
removeAccessToken()
|
|
removeRefreshToken()
|
|
removeTokenExpiry()
|
|
}
|
|
|
|
export function getAccessTokenOrRedirect(): string {
|
|
const accessToken = getAccessToken()
|
|
if (accessToken) {
|
|
return accessToken
|
|
} else {
|
|
window.location.href = '/sign-in'
|
|
return ''
|
|
}
|
|
}
|
|
|
|
export function getAccessToken() {
|
|
const accessToken = loadAccessToken()
|
|
const tokenExpiry = loadTokenExpiry()
|
|
if (accessToken && tokenExpiry && new Date() < new Date(tokenExpiry)) {
|
|
return accessToken
|
|
} else {
|
|
clearToken()
|
|
}
|
|
}
|
|
|
|
setInterval(async () => {
|
|
const refreshToken = loadRefreshToken()
|
|
const tokenExpiry = loadTokenExpiry()
|
|
if (tokenExpiry && refreshToken) {
|
|
const earlyExpiry = new Date(tokenExpiry)
|
|
earlyExpiry.setMinutes(earlyExpiry.getMinutes() - 1)
|
|
if (new Date() >= earlyExpiry) {
|
|
const token = await TokenAPI.exchange({
|
|
grant_type: 'refresh_token',
|
|
refresh_token: refreshToken,
|
|
})
|
|
saveToken(token)
|
|
}
|
|
}
|
|
}, 5000)
|