Files
front-pc/utils/RefreshToken.ts

134 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios, { AxiosRequestConfig, AxiosInstance, AxiosResponse } from 'axios'
import type { AppMemberUserInfoRespVO } from '@/api/common/types'
export type onRefreshTokenResponse = (data: AxiosResponse | boolean) => { token: string; refreshToken: string } | false
export type TRefreshTokenConstructorConfig = {
refreshTokenApiUrl: string
refreshTokenKey?: string
tokenKey?: string
axiosInstance: AxiosInstance
onRefreshTokenResponse: onRefreshTokenResponse
onRefreshTokenResquest?: () => {
config?: AxiosRequestConfig
data?: any
}
}
export default class RefreshToken {
static instance: RefreshToken
static SOTRAGE_REFRESH_TOKEN_KEY = 'kl-tk'
static SOTRAGE_TOKENKEY = 'kl-rfk'
static SOTRAGE_USERID = 'kl-userId'
static SOTRAGE_USERNAME = 'kl-userName'
static SOTRAGE_USERINFO = 'kl-userInfo'
private REFRESH_TOKEN_API_URL: string
public pending = false
private axios: AxiosInstance
public callbacks: any[] = []
private onRefreshTokenResponse: onRefreshTokenResponse
private onRefreshTokenResquest?: () => {
config?: AxiosRequestConfig
data?: any
}
protected constructor(config: TRefreshTokenConstructorConfig) {
RefreshToken.SOTRAGE_REFRESH_TOKEN_KEY = config?.refreshTokenKey || 'kl-tk'
RefreshToken.SOTRAGE_TOKENKEY = config?.refreshTokenKey || 'kl-rfk'
RefreshToken.SOTRAGE_USERID = config?.refreshTokenKey || 'kl-userId'
this.REFRESH_TOKEN_API_URL = config?.refreshTokenApiUrl || ''
this.axios = config.axiosInstance
this.onRefreshTokenResponse = config.onRefreshTokenResponse
this.onRefreshTokenResquest = config.onRefreshTokenResquest
}
static create(config: TRefreshTokenConstructorConfig) {
if (!RefreshToken.instance) {
RefreshToken.instance = new RefreshToken(config)
}
return RefreshToken.instance
}
// 设置token
setToken(token: string, refreshToken: string) {
window.localStorage.setItem(RefreshToken.SOTRAGE_TOKENKEY, token)
window.localStorage.setItem(RefreshToken.SOTRAGE_REFRESH_TOKEN_KEY, refreshToken)
}
// 清除token
removeToken() {
window.localStorage.removeItem(RefreshToken.SOTRAGE_TOKENKEY)
window.localStorage.removeItem(RefreshToken.SOTRAGE_REFRESH_TOKEN_KEY)
//清除token一起把userID也清除了
window.localStorage.removeItem(RefreshToken.SOTRAGE_USERID)
window.localStorage.removeItem(RefreshToken.SOTRAGE_USERNAME)
window.localStorage.removeItem(RefreshToken.SOTRAGE_USERINFO)
}
//设置userID
setUserId(userId: string) {
window.localStorage.setItem(RefreshToken.SOTRAGE_USERID, userId)
}
setUserName(userName: string) {
window.localStorage.setItem(RefreshToken.SOTRAGE_USERNAME, userName)
}
setUserInfo(userInfo: AppMemberUserInfoRespVO) {
window.localStorage.setItem(RefreshToken.SOTRAGE_USERINFO, JSON.stringify(userInfo))
}
// 获取token
getToken() {
const token = window.localStorage.getItem(RefreshToken.SOTRAGE_TOKENKEY) || ''
const refreshToken = window.localStorage.getItem(RefreshToken.SOTRAGE_REFRESH_TOKEN_KEY) || ''
const userId = window.localStorage.getItem(RefreshToken.SOTRAGE_USERID) || ''
const userName = window.localStorage.getItem(RefreshToken.SOTRAGE_USERNAME) || ''
const userInfo = window.localStorage.getItem(RefreshToken.SOTRAGE_USERINFO) || ''
return {
token,
refreshToken,
userId,
userName,
userInfo: userInfo ? JSON.parse(userInfo) : {},
}
}
// 刷新token
refresh() {
return new Promise<{ token: string; refreshToken: string } | boolean>((resolve) => {
this.pending = true
const config = (this.onRefreshTokenResquest && this.onRefreshTokenResquest()) || {}
axios
.post(this.REFRESH_TOKEN_API_URL, config.data || {}, config.config)
.then((res) => {
const ac = this.onRefreshTokenResponse(res)
if (ac) {
// 设置新的token
this.setToken(ac.token, ac.refreshToken)
resolve(ac)
return
}
resolve(false)
})
.catch((e) => {
console.log(e)
this.onRefreshTokenResponse(false)
resolve(false)
})
.finally(() => {
this.pending = false
})
})
}
// 推入刷新token成功 回调队列
pushCallbacks(config: AxiosRequestConfig) {
return new Promise((resolve) => {
this.callbacks.push(() => {
resolve(this.axios(config))
})
})
}
// 推出队列回调
releaseQueue() {
// const tokens = this.getToken()
this.callbacks.forEach((item) => {
item()
})
this.callbacks = []
}
}